Fix an assertion that was not safe when running in parallel
authorSimon Marlow <marlowsd@gmail.com>
Thu, 25 Mar 2010 14:36:56 +0000 (14:36 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Thu, 25 Mar 2010 14:36:56 +0000 (14:36 +0000)
rts/sm/MarkWeak.c

index 9df39b9..0ac807f 100644 (file)
@@ -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) {