From 96195367ad299bc3be251535bcff7fb75d097e07 Mon Sep 17 00:00:00 2001 From: Simon Marlow Date: Wed, 16 Apr 2008 22:10:02 +0000 Subject: [PATCH] wait for threads to start up properly --- rts/sm/GC.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/rts/sm/GC.c b/rts/sm/GC.c index 722de0f..1ac27f2 100644 --- a/rts/sm/GC.c +++ b/rts/sm/GC.c @@ -978,7 +978,8 @@ alloc_gc_thread (int n) t->id = 0; initCondition(&t->wake_cond); initMutex(&t->wake_mutex); - t->wakeup = rtsFalse; + t->wakeup = rtsTrue; // starts true, so we can wait for the + // thread to start up, see wakeup_gc_threads t->exit = rtsFalse; #endif @@ -1189,7 +1190,16 @@ wakeup_gc_threads (nat n_threads USED_IF_THREADS) nat i; for (i=1; i < n_threads; i++) { inc_running(); - ACQUIRE_LOCK(&gc_threads[i]->wake_mutex); + debugTrace(DEBUG_gc, "waking up gc thread %d", i); + do { + ACQUIRE_LOCK(&gc_threads[i]->wake_mutex); + if (gc_threads[i]->wakeup) { + RELEASE_LOCK(&gc_threads[i]->wake_mutex); + continue; + } else { + break; + } + } while (1); gc_threads[i]->wakeup = rtsTrue; signalCondition(&gc_threads[i]->wake_cond); RELEASE_LOCK(&gc_threads[i]->wake_mutex); -- 1.7.10.4