don't closeMutex() the Capability lock
authorSimon Marlow <simonmar@microsoft.com>
Thu, 31 Aug 2006 08:57:28 +0000 (08:57 +0000)
committerSimon Marlow <simonmar@microsoft.com>
Thu, 31 Aug 2006 08:57:28 +0000 (08:57 +0000)
There might be threads in foreign calls that will attempt to return
via resumeThread() and grab this lock, so we can't safely destroy it.

Fixes one cause of

   internal error: ASSERTION FAILED: file Capability.c, line 90

although I haven't repeated that assertion failure in the wild, only
with a specially crafted test case, so I can't be sure I really got
it.

rts/Capability.c

index 7fc1c57..99c68fd 100644 (file)
@@ -678,8 +678,10 @@ shutdownCapability (Capability *cap, Task *task)
     // we now have the Capability, its run queue and spare workers
     // list are both empty.
 
-    // We end up here only in THREADED_RTS
-    closeMutex(&cap->lock);
+    // ToDo: we can't drop this mutex, because there might still be
+    // threads performing foreign calls that will eventually try to 
+    // return via resumeThread() and attempt to grab cap->lock.
+    // closeMutex(&cap->lock);
 }
 
 /* ----------------------------------------------------------------------------