Commit d9275dd0 authored by Simon Marlow's avatar Simon Marlow

Lock the StablePtr table during GC

Allows hs_free_fun_ptr() to be called by a separate thread
parent 1d6d8bc1
......@@ -57,4 +57,7 @@ extern void threadStablePtrTable ( evac_fn evac, void *user );
extern void gcStablePtrTable ( void );
extern void updateStablePtrTable ( rtsBool full );
extern void stablePtrPreGC ( void );
extern void stablePtrPostGC ( void );
#endif
......@@ -315,6 +315,23 @@ enlargeStablePtrTable(void)
initFreeList(stable_ptr_table + old_SPT_size, old_SPT_size, NULL);
}
/* -----------------------------------------------------------------------------
* We must lock the StablePtr table during GC, to prevent simultaneous
* calls to freeStablePtr().
* -------------------------------------------------------------------------- */
void
stablePtrPreGC(void)
{
ACQUIRE_LOCK(&stable_mutex);
}
void
stablePtrPostGC(void)
{
RELEASE_LOCK(&stable_mutex);
}
/* -----------------------------------------------------------------------------
* Treat stable pointers as roots for the garbage collector.
*
......
......@@ -215,6 +215,9 @@ GarbageCollect (rtsBool force_major_gc,
// tell the STM to discard any cached closures it's hoping to re-use
stmPreGCHook();
// lock the StablePtr table
stablePtrPreGC();
#ifdef DEBUG
mutlist_MUTVARS = 0;
mutlist_MUTARRS = 0;
......@@ -794,6 +797,9 @@ SET_GCT(gc_threads[0]);
slop = calcLiveBlocks() * BLOCK_SIZE_W - live;
stat_endGC(allocated, live, copied, N, max_copied, avg_copied, slop);
// unlock the StablePtr table
stablePtrPostGC();
// Guess which generation we'll collect *next* time
initialise_N(force_major_gc);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment