From: Simon Marlow Date: Mon, 23 Mar 2009 09:29:53 +0000 (+0000) Subject: Fix locking in evacuate_large() (FIX openfile008(threaded2)) X-Git-Tag: 2009-06-25~448 X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=commitdiff_plain;h=30554cc82c2aeec64b03495048a650a3c0443d3c Fix locking in evacuate_large() (FIX openfile008(threaded2)) --- diff --git a/rts/sm/Evac.c b/rts/sm/Evac.c index 062b73f..6325a12 100644 --- a/rts/sm/Evac.c +++ b/rts/sm/Evac.c @@ -295,8 +295,10 @@ evacuate_large(StgPtr p) // them straight on the scavenged_large_objects list. if (bd->flags & BF_PINNED) { ASSERT(get_itbl((StgClosure *)p)->type == ARR_WORDS); - dbl_link_onto(bd, &ws->step->scavenged_large_objects); - ws->step->n_scavenged_large_blocks += bd->blocks; + if (new_stp != stp) { ACQUIRE_SPIN_LOCK(&new_stp->sync_large_objects); } + dbl_link_onto(bd, &new_stp->scavenged_large_objects); + new_stp->n_scavenged_large_blocks += bd->blocks; + if (new_stp != stp) { RELEASE_SPIN_LOCK(&new_stp->sync_large_objects); } } else { bd->link = ws->todo_large_objects; ws->todo_large_objects = bd;