summaryrefslogtreecommitdiff
path: root/rts/Stable.c
diff options
context:
space:
mode:
authorSimon Marlow <marlowsd@gmail.com>2009-06-04 09:05:53 +0000
committerSimon Marlow <marlowsd@gmail.com>2009-06-04 09:05:53 +0000
commitd9275dd06ee24575ff50a6696fe7fe1e1fa91ac7 (patch)
tree28b1a6efcbb9dfe6a18b5f6d8b1fa95f905d38a1 /rts/Stable.c
parent1d6d8bc152fdcabea6d26525f269d8ade8b75dd6 (diff)
downloadhaskell-d9275dd06ee24575ff50a6696fe7fe1e1fa91ac7.tar.gz
Lock the StablePtr table during GC
Allows hs_free_fun_ptr() to be called by a separate thread
Diffstat (limited to 'rts/Stable.c')
-rw-r--r--rts/Stable.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/rts/Stable.c b/rts/Stable.c
index 94a756a380..97796b89a7 100644
--- a/rts/Stable.c
+++ b/rts/Stable.c
@@ -316,6 +316,23 @@ enlargeStablePtrTable(void)
}
/* -----------------------------------------------------------------------------
+ * 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.
*
* A stable pointer is any stable name entry with a ref > 0. We'll