From: Simon Marlow Date: Wed, 16 Apr 2008 22:10:02 +0000 (+0000) Subject: wait for threads to start up properly X-Git-Tag: Before_cabalised-GHC~216 X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=commitdiff_plain;h=96195367ad299bc3be251535bcff7fb75d097e07 wait for threads to start up properly --- 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);