From 519959ad825bfad0b62a2012c064e582788d8f21 Mon Sep 17 00:00:00 2001 From: Evgenii Stepanov Date: Thu, 28 May 2020 14:30:19 -0700 Subject: [PATCH] [scudo] Fix deadlock in ScudoWrappersCTest.DisableForkEnable test. pthread_cond_wait needs a loop around it to handle spurious wake ups, as well as the case when signal runs before wait. --- compiler-rt/lib/scudo/standalone/tests/wrappers_c_test.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/compiler-rt/lib/scudo/standalone/tests/wrappers_c_test.cpp b/compiler-rt/lib/scudo/standalone/tests/wrappers_c_test.cpp index 8b2bc6e..b41908c 100644 --- a/compiler-rt/lib/scudo/standalone/tests/wrappers_c_test.cpp +++ b/compiler-rt/lib/scudo/standalone/tests/wrappers_c_test.cpp @@ -372,6 +372,7 @@ TEST(ScudoWrappersCTest, Fork) { static pthread_mutex_t Mutex; static pthread_cond_t Conditional = PTHREAD_COND_INITIALIZER; +static bool Ready; static void *enableMalloc(void *Unused) { // Initialize the allocator for this thread. @@ -382,6 +383,7 @@ static void *enableMalloc(void *Unused) { // Signal the main thread we are ready. pthread_mutex_lock(&Mutex); + Ready = true; pthread_cond_signal(&Conditional); pthread_mutex_unlock(&Mutex); @@ -398,7 +400,8 @@ TEST(ScudoWrappersCTest, DisableForkEnable) { // Wait for the thread to be warmed up. pthread_mutex_lock(&Mutex); - pthread_cond_wait(&Conditional, &Mutex); + while (!Ready) + pthread_cond_wait(&Conditional, &Mutex); pthread_mutex_unlock(&Mutex); // Disable the allocator and fork. fork should succeed after malloc_enable. -- 2.7.4