-
Notifications
You must be signed in to change notification settings - Fork 14.3k
Fix flaky test: signal_in_mutex_lock.cpp #92587
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@llvm/pr-subscribers-compiler-rt-sanitizer Author: Julian Lettner (yln) ChangesFix flaky test: the spawned thread keeps spinning My understanding of C++ semantics are that the rdar://126768628 Full diff: https://github.com/llvm/llvm-project/pull/92587.diff 1 Files Affected:
diff --git a/compiler-rt/test/tsan/signal_in_mutex_lock.cpp b/compiler-rt/test/tsan/signal_in_mutex_lock.cpp
index ec99e23198400..7795351213d2a 100644
--- a/compiler-rt/test/tsan/signal_in_mutex_lock.cpp
+++ b/compiler-rt/test/tsan/signal_in_mutex_lock.cpp
@@ -13,9 +13,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<bool> spin = true;
void *ThreadFunc(void *x) {
- while (true) {
+ while (spin) {
// Lock the mutex
std::lock_guard<std::mutex> guard(sampler_mutex);
// Mutex is released at the end
@@ -51,20 +52,26 @@ int main() {
pthread_t thread;
pthread_create(&thread, NULL, ThreadFunc, NULL);
- // Lock the mutex before sending the signal
- std::lock_guard<std::mutex> guard(sampler_mutex);
- // From now on thread 1 will be waiting for the lock
+ {
+ // Lock the mutex before sending the signal
+ std::lock_guard<std::mutex> 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:
|
Seeing flaky failures for this test:
Mutex is destroyed from main thread ( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
Fix flaky test: the spawned thread keeps spinning on `sampler_mutex` which may be released before the thread is terminated based on termination ordering. My understanding of C++ semantics are that the program here is invalid: the destructors of global variables are invoked at the time of program termination, and it is the responsibility of the program to ensure that invoking those destructors is safe. rdar://126768628
d4e3e17
to
84c8627
Compare
Fix flaky test: the spawned thread keeps spinning
on
sampler_mutex
which may be released beforethe thread is terminated based on termination
ordering.
My understanding of C++ semantics are that the
program here is invalid: the destructors of global
variables are invoked at the time of program
termination, and it is the responsibility of the
program to ensure that invoking those destructors
is safe.
rdar://126768628