We have been seeing this test fail intermittently on our 2 stage AArch64 bot. As far back as https://lab.llvm.org/buildbot/#/builders/53/builds/2694 Likely due to a lack of resources at certain times on the shared machine. Up the time limit to give us some more room. (this limit only applies to the watchdog thread, so if the test passes then it won't take 20s)
53 lines
1.1 KiB
C++
53 lines
1.1 KiB
C++
// Regression test for a deadlock in leak detection,
|
|
// where lsan would call dl_iterate_phdr while holding the allocator lock.
|
|
// RUN: %clangxx_lsan %s -o %t && %run %t
|
|
|
|
#include <link.h>
|
|
#include <mutex>
|
|
#include <stdlib.h>
|
|
#include <thread>
|
|
#include <unistd.h>
|
|
|
|
std::mutex in, out;
|
|
|
|
int Callback(struct dl_phdr_info *info, size_t size, void *data) {
|
|
for (int step = 0; step < 50; ++step) {
|
|
void *p[1000];
|
|
for (int i = 0; i < 1000; ++i)
|
|
p[i] = malloc(10 * i);
|
|
|
|
if (step == 0)
|
|
in.unlock();
|
|
|
|
for (int i = 0; i < 1000; ++i)
|
|
free(p[i]);
|
|
}
|
|
out.unlock();
|
|
return 1; // just once
|
|
}
|
|
|
|
void Watchdog() {
|
|
// This is just a fail-safe to turn a deadlock (in case the bug reappears)
|
|
// into a (slow) test failure.
|
|
usleep(20000000);
|
|
if (!out.try_lock()) {
|
|
write(2, "DEADLOCK\n", 9);
|
|
exit(1);
|
|
}
|
|
}
|
|
|
|
int main() {
|
|
in.lock();
|
|
out.lock();
|
|
|
|
std::thread t([] { dl_iterate_phdr(Callback, nullptr); });
|
|
t.detach();
|
|
|
|
std::thread w(Watchdog);
|
|
w.detach();
|
|
|
|
// Wait for the malloc thread to preheat, then start leak detection (on exit)
|
|
in.lock();
|
|
return 0;
|
|
}
|