From d9275dd06ee24575ff50a6696fe7fe1e1fa91ac7 Mon Sep 17 00:00:00 2001 From: Simon Marlow Date: Thu, 4 Jun 2009 09:05:53 +0000 Subject: Lock the StablePtr table during GC Allows hs_free_fun_ptr() to be called by a separate thread --- rts/Stable.c | 17 +++++++++++++++++ rts/sm/GC.c | 6 ++++++ 2 files changed, 23 insertions(+) (limited to 'rts') diff --git a/rts/Stable.c b/rts/Stable.c index 94a756a380..97796b89a7 100644 --- a/rts/Stable.c +++ b/rts/Stable.c @@ -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. * diff --git a/rts/sm/GC.c b/rts/sm/GC.c index e0c8b05436..cfe4c6bdb5 100644 --- a/rts/sm/GC.c +++ b/rts/sm/GC.c @@ -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); -- cgit v1.2.1