task->cap = cap;
- for (i = 0; i < 50; i++) {
+ // Loop indefinitely until all the workers have exited and there
+ // are no Haskell threads left. We used to bail out after 50
+ // iterations of this loop, but that occasionally left a worker
+ // running which caused problems later (the closeMutex() below
+ // isn't safe, for one thing).
+
+ for (i = 0; /* i < 50 */; i++) {
debugTrace(DEBUG_sched,
"shutting down capability %d, attempt %d", cap->no, i);
ACQUIRE_LOCK(&cap->lock);
// 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);
}
/* ----------------------------------------------------------------------------