From f8a01fb39f3756bec409c9b752fd4f8088e130bf Mon Sep 17 00:00:00 2001 From: Simon Marlow Date: Tue, 9 Mar 2010 09:58:31 +0000 Subject: [PATCH] Fix a rare deadlock when the IO manager thread is slow to start up This fixes occasional failures of ffi002(threaded1) on a loaded machine. --- rts/Capability.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/rts/Capability.c b/rts/Capability.c index c37ec4e..cf85372 100644 --- a/rts/Capability.c +++ b/rts/Capability.c @@ -786,10 +786,18 @@ shutdownCapability (Capability *cap, Task *task, rtsBool safe) "thread(s) are involved in foreign calls, yielding"); cap->running_task = NULL; RELEASE_LOCK(&cap->lock); + // The IO manager thread might have been slow to start up, + // so the first attempt to kill it might not have + // succeeded. Just in case, try again - the kill message + // will only be sent once. + // + // To reproduce this deadlock: run ffi002(threaded1) + // repeatedly on a loaded machine. + ioManagerDie(); yieldThread(); continue; } - + traceEventShutdown(cap); RELEASE_LOCK(&cap->lock); break; -- 1.7.10.4