diff options
author | Simon Marlow <marlowsd@gmail.com> | 2010-03-25 14:36:56 +0000 |
---|---|---|
committer | Simon Marlow <marlowsd@gmail.com> | 2010-03-25 14:36:56 +0000 |
commit | 6eb7886a38836b8a6d7445d2003271b4e2125034 (patch) | |
tree | 483b95e21e70f4edb3d578b1e34da6c21b6fa07e /rts | |
parent | ccd5aec2104ec4f904f97d948f2dcd9dcea03eef (diff) | |
download | haskell-6eb7886a38836b8a6d7445d2003271b4e2125034.tar.gz |
Fix an assertion that was not safe when running in parallel
Diffstat (limited to 'rts')
-rw-r--r-- | rts/sm/MarkWeak.c | 15 |
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) { |