summaryrefslogtreecommitdiff
path: root/rts
diff options
context:
space:
mode:
authorSimon Marlow <marlowsd@gmail.com>2010-03-25 14:36:56 +0000
committerSimon Marlow <marlowsd@gmail.com>2010-03-25 14:36:56 +0000
commit6eb7886a38836b8a6d7445d2003271b4e2125034 (patch)
tree483b95e21e70f4edb3d578b1e34da6c21b6fa07e /rts
parentccd5aec2104ec4f904f97d948f2dcd9dcea03eef (diff)
downloadhaskell-6eb7886a38836b8a6d7445d2003271b4e2125034.tar.gz
Fix an assertion that was not safe when running in parallel
Diffstat (limited to 'rts')
-rw-r--r--rts/sm/MarkWeak.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/rts/sm/MarkWeak.c b/rts/sm/MarkWeak.c
index 9df39b9a08..0ac807ff79 100644
--- a/rts/sm/MarkWeak.c
+++ b/rts/sm/MarkWeak.c
@@ -368,9 +368,18 @@ markWeakPtrList ( void )
last_w = &weak_ptr_list;
for (w = weak_ptr_list; w; w = w->link) {
// w might be WEAK, EVACUATED, or DEAD_WEAK (actually CON_STATIC) here
- ASSERT(IS_FORWARDING_PTR(w->header.info)
- || w->header.info == &stg_DEAD_WEAK_info
- || get_itbl(w)->type == WEAK);
+
+#ifdef DEBUG
+ { // careful to do this assertion only reading the info ptr
+ // once, because during parallel GC it might change under our feet.
+ const StgInfoTable *info;
+ info = w->header.info;
+ ASSERT(IS_FORWARDING_PTR(info)
+ || info == &stg_DEAD_WEAK_info
+ || INFO_PTR_TO_STRUCT(info)->type == WEAK);
+ }
+#endif
+
evacuate((StgClosure **)last_w);
w = *last_w;
if (w->header.info == &stg_DEAD_WEAK_info) {