From 30554cc82c2aeec64b03495048a650a3c0443d3c Mon Sep 17 00:00:00 2001 From: Simon Marlow Date: Mon, 23 Mar 2009 09:29:53 +0000 Subject: [PATCH] Fix locking in evacuate_large() (FIX openfile008(threaded2)) --- rts/sm/Evac.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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; -- 1.7.10.4