Skip to content

Commit

Permalink
[scudo] Fix deadlock in ScudoWrappersCTest.DisableForkEnable test.
Browse files Browse the repository at this point in the history
pthread_cond_wait needs a loop around it to handle spurious wake ups,
as well as the case when signal runs before wait.
  • Loading branch information
eugenis committed May 28, 2020
1 parent 6eb5679 commit 519959a
Showing 1 changed file with 4 additions and 1 deletion.
5 changes: 4 additions & 1 deletion compiler-rt/lib/scudo/standalone/tests/wrappers_c_test.cpp
Expand Up @@ -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.
Expand All @@ -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);

Expand All @@ -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.
Expand Down

0 comments on commit 519959a

Please sign in to comment.