From 6eb7886a38836b8a6d7445d2003271b4e2125034 Mon Sep 17 00:00:00 2001 From: Simon Marlow Date: Thu, 25 Mar 2010 14:36:56 +0000 Subject: [PATCH] Fix an assertion that was not safe when running in parallel --- rts/sm/MarkWeak.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) 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) { -- 1.7.10.4