From: Simon Marlow Date: Thu, 25 Mar 2010 14:36:56 +0000 (+0000) Subject: Fix an assertion that was not safe when running in parallel X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=commitdiff_plain;h=6eb7886a38836b8a6d7445d2003271b4e2125034 Fix an assertion that was not safe when running in parallel --- diff --git a/rts/sm/MarkWeak.c b/rts/sm/MarkWeak.c index 9df39b9..0ac807f 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) {