Fixes a bug whereby the Capability has been freed but other
Capabilities are still trying to steal sparks from its pool.
}
debugTrace(DEBUG_sched, "capability %d is stopped.", cap->no);
}
debugTrace(DEBUG_sched, "capability %d is stopped.", cap->no);
RELEASE_LOCK(&cap->lock);
break;
}
RELEASE_LOCK(&cap->lock);
break;
}
#endif /* THREADED_RTS */
#endif /* THREADED_RTS */
-void
-freeCapability (Capability *cap) {
+static void
+freeCapability (Capability *cap)
+{
stgFree(cap->mut_lists);
#if defined(THREADED_RTS) || defined(PARALLEL_HASKELL)
freeSparkPool(cap->sparks);
#endif
}
stgFree(cap->mut_lists);
#if defined(THREADED_RTS) || defined(PARALLEL_HASKELL)
freeSparkPool(cap->sparks);
#endif
}
+void
+freeCapabilities (void)
+{
+#if defined(THREADED_RTS)
+ nat i;
+ for (i=0; i < n_capabilities; i++) {
+ freeCapability(&capabilities[i]);
+ }
+#else
+ freeCapability(&MainCapability);
+#endif
+}
+
/* ---------------------------------------------------------------------------
Mark everything directly reachable from the Capabilities. When
using multiple GC threads, each GC thread marks all Capabilities
/* ---------------------------------------------------------------------------
Mark everything directly reachable from the Capabilities. When
using multiple GC threads, each GC thread marks all Capabilities
// cause all capabilities to context switch as soon as possible.
void setContextSwitches(void);
// cause all capabilities to context switch as soon as possible.
void setContextSwitches(void);
-// Free a capability on exit
-void freeCapability (Capability *cap);
+// Free all capabilities
+void freeCapabilities (void);
// FOr the GC:
void markSomeCapabilities (evac_fn evac, void *user, nat i0, nat delta,
// FOr the GC:
void markSomeCapabilities (evac_fn evac, void *user, nat i0, nat delta,
boundTaskExiting(task);
stopTaskManager();
}
boundTaskExiting(task);
stopTaskManager();
}
-#else
- freeCapability(&MainCapability);
#endif
}
void
freeScheduler( void )
{
#endif
}
void
freeScheduler( void )
{
freeTaskManager();
if (n_capabilities != 1) {
stgFree(capabilities);
freeTaskManager();
if (n_capabilities != 1) {
stgFree(capabilities);