From 8a3574d5fb7facf94d1f9ae766e759642b12f9b5 Mon Sep 17 00:00:00 2001 From: Simon Marlow Date: Wed, 22 Feb 2006 16:07:33 +0000 Subject: [PATCH] check black holes before doing GC in scheduleDoHeapProfile() fixes #687, see comment for details. --- ghc/rts/Schedule.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/ghc/rts/Schedule.c b/ghc/rts/Schedule.c index 6fa21b7..3f10e70 100644 --- a/ghc/rts/Schedule.c +++ b/ghc/rts/Schedule.c @@ -1869,8 +1869,19 @@ scheduleDoHeapProfile( rtsBool ready_to_gc STG_UNUSED ) if (performHeapProfile || (RtsFlags.ProfFlags.profileInterval==0 && RtsFlags.ProfFlags.doHeapProfile && ready_to_gc)) { + + // checking black holes is necessary before GC, otherwise + // there may be threads that are unreachable except by the + // blackhole queue, which the GC will consider to be + // deadlocked. + scheduleCheckBlackHoles(&MainCapability); + + IF_DEBUG(scheduler, sched_belch("garbage collecting before heap census")); GarbageCollect(GetRoots, rtsTrue); + + IF_DEBUG(scheduler, sched_belch("performing heap census")); heapCensus(); + performHeapProfile = rtsFalse; return rtsTrue; // true <=> we already GC'd } -- 1.7.10.4