From 4760739d3176176d9ecb2af2212efb9e11ae2940 Mon Sep 17 00:00:00 2001 From: Simon Marlow Date: Wed, 5 Nov 2008 15:05:42 +0000 Subject: [PATCH] deadlock fix: reset the flag *after* checking the blackhole queue --- rts/Schedule.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/rts/Schedule.c b/rts/Schedule.c index 8ab964d..569c3d0 100644 --- a/rts/Schedule.c +++ b/rts/Schedule.c @@ -934,8 +934,13 @@ scheduleCheckBlackHoles (Capability *cap) { ACQUIRE_LOCK(&sched_mutex); if ( blackholes_need_checking ) { - checkBlackHoles(cap); blackholes_need_checking = rtsFalse; + // important that we reset the flag *before* checking the + // blackhole queue, otherwise we could get deadlock. This + // happens as follows: we wake up a thread that + // immediately runs on another Capability, blocks on a + // blackhole, and then we reset the blackholes_need_checking flag. + checkBlackHoles(cap); } RELEASE_LOCK(&sched_mutex); } -- 1.7.10.4