diff --git a/compiler-rt/test/tsan/signal_in_mutex_lock.cpp b/compiler-rt/test/tsan/signal_in_mutex_lock.cpp index ec99e23198400f..49b8536539389d 100644 --- a/compiler-rt/test/tsan/signal_in_mutex_lock.cpp +++ b/compiler-rt/test/tsan/signal_in_mutex_lock.cpp @@ -5,6 +5,7 @@ #include #include +#include #include #include #include @@ -13,9 +14,10 @@ std::mutex sampler_mutex; //dummy mutex to lock in the thread we spawn. std::mutex done_mutex; // guards the cv and done variables. std::condition_variable cv; bool done = false; +std::atomic spin = true; void *ThreadFunc(void *x) { - while (true) { + while (spin) { // Lock the mutex std::lock_guard guard(sampler_mutex); // Mutex is released at the end @@ -51,20 +53,26 @@ int main() { pthread_t thread; pthread_create(&thread, NULL, ThreadFunc, NULL); - // Lock the mutex before sending the signal - std::lock_guard guard(sampler_mutex); - // From now on thread 1 will be waiting for the lock + { + // Lock the mutex before sending the signal + std::lock_guard guard(sampler_mutex); + // From now on thread 1 will be waiting for the lock - // Send the SIGPROF signal to thread. - int r = pthread_kill(thread, SIGPROF); - assert(r == 0); + // Send the SIGPROF signal to thread. + int r = pthread_kill(thread, SIGPROF); + assert(r == 0); - // Wait until signal handler sends the data. - std::unique_lock lk(done_mutex); - cv.wait(lk, [] { return done; }); + // Wait until signal handler sends the data. + std::unique_lock lk(done_mutex); + cv.wait(lk, [] { return done; }); + + // We got the done variable from the signal handler. Exiting successfully. + fprintf(stderr, "PASS\n"); + } - // We got the done variable from the signal handler. Exiting successfully. - fprintf(stderr, "PASS\n"); + // Wait for thread to prevent it from spinning on a released mutex. + spin = false; + pthread_join(thread, nullptr); } // CHECK-NOT: WARNING: ThreadSanitizer: