[commit: ghc] local-gc: fix an interaction between the new pinned_object_block policy and (ab5aad5)
Simon Marlow
marlowsd at gmail.com
Mon Jun 6 05:57:28 CEST 2011
Repository : ssh://darcs.haskell.org//srv/darcs/ghc
On branch : local-gc
http://hackage.haskell.org/trac/ghc/changeset/ab5aad587de8e3d9dde539982ae728b33e5bca50
>---------------------------------------------------------------
commit ab5aad587de8e3d9dde539982ae728b33e5bca50
Author: Simon Marlow <marlowsd at gmail.com>
Date: Mon Jun 6 04:52:27 2011 +0100
fix an interaction between the new pinned_object_block policy and
globalisation.
>---------------------------------------------------------------
rts/sm/Globalise.c | 13 +++++++++++++
rts/sm/Storage.c | 12 ++++++++----
2 files changed, 21 insertions(+), 4 deletions(-)
diff --git a/rts/sm/Globalise.c b/rts/sm/Globalise.c
index ff9db7b..831d45e 100644
--- a/rts/sm/Globalise.c
+++ b/rts/sm/Globalise.c
@@ -217,6 +217,19 @@ globalise_large (StgPtr p)
ACQUIRE_SPIN_LOCK(&gen->sync);
+ // the object we need to globalise might be in the
+ // pinned_object_block, which is still being allocated into. In
+ // that case, we just mark the pinned_object_block with the global
+ // generation, and allocatePinned() will attach the block to the
+ // correct gen->large_objects list when it is full.
+ if (bd == gct->cap->pinned_object_block) {
+ new_gen = &all_generations[global_gen_ix];
+ initBdescr(bd, new_gen, new_gen->to);
+
+ RELEASE_SPIN_LOCK(&gen->sync);
+ return;
+ }
+
// remove from large_object list
if (bd->u.back) {
bd->u.back->link = bd->link;
diff --git a/rts/sm/Storage.c b/rts/sm/Storage.c
index 3a8c0fa..eaffdc6 100644
--- a/rts/sm/Storage.c
+++ b/rts/sm/Storage.c
@@ -778,16 +778,20 @@ allocatePinned (Capability *cap, lnat n)
// the next GC the BF_EVACUATED flag will be cleared, and the
// block will be promoted as usual (if anything in it is
// live).
- ACQUIRE_SM_LOCK;
- gen = cap->r.rG0; // use our local G0
if (bd != NULL) {
+ gen = bd->gen;
+ // attach it to the correct generation - the block might
+ // have been globalised by now (see globalise_large()).
+ if (gen->no != 0) { ACQUIRE_SPIN_LOCK(&gen->sync); }
dbl_link_onto(bd, &gen->large_objects);
gen->n_large_blocks++;
- g0->n_new_large_words += bd->free - bd->start;
+ gen->n_new_large_words += bd->free - bd->start;
+ if (gen->no != 0) { RELEASE_SPIN_LOCK(&gen->sync); }
}
+ ACQUIRE_SM_LOCK;
cap->pinned_object_block = bd = allocBlock();
RELEASE_SM_LOCK;
- initBdescr(bd, gen, gen);
+ initBdescr(bd, cap->r.rG0, cap->r.rG0); // use our local G0
bd->flags = BF_PINNED | BF_LARGE | BF_EVACUATED;
bd->free = bd->start;
}
More information about the Cvs-ghc
mailing list