summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rts/sm/GC.c14
-rw-r--r--rts/sm/GCThread.h1
-rw-r--r--rts/sm/Storage.c23
-rw-r--r--rts/sm/Storage.h2
4 files changed, 25 insertions, 15 deletions
diff --git a/rts/sm/GC.c b/rts/sm/GC.c
index a6b8c4af64..ab0ba640c1 100644
--- a/rts/sm/GC.c
+++ b/rts/sm/GC.c
@@ -629,7 +629,16 @@ GarbageCollect (rtsBool force_major_gc,
}
// Reset the nursery: make the blocks empty
- allocated += clearNurseries();
+ if (n_gc_threads == 1) {
+ for (n = 0; n < n_capabilities; n++) {
+ allocated += clearNursery(&capabilities[n]);
+ }
+ } else {
+ gct->allocated = clearNursery(cap);
+ for (n = 0; n < n_capabilities; n++) {
+ allocated += gc_threads[n]->allocated;
+ }
+ }
resize_nursery();
@@ -1094,6 +1103,8 @@ gcWorkerThread (Capability *cap)
scavenge_until_all_done();
+ gct->allocated = clearNursery(cap);
+
#ifdef THREADED_RTS
// Now that the whole heap is marked, we discard any sparks that
// were found to be unreachable. The main GC thread is currently
@@ -1477,6 +1488,7 @@ init_gc_thread (gc_thread *t)
t->failed_to_evac = rtsFalse;
t->eager_promotion = rtsTrue;
t->thunk_selector_depth = 0;
+ t->allocated = 0;
t->copied = 0;
t->scanned = 0;
t->any_work = 0;
diff --git a/rts/sm/GCThread.h b/rts/sm/GCThread.h
index 60f721285d..1b811e43fc 100644
--- a/rts/sm/GCThread.h
+++ b/rts/sm/GCThread.h
@@ -176,6 +176,7 @@ typedef struct gc_thread_ {
// -------------------
// stats
+ lnat allocated; // result of clearNursery()
lnat copied;
lnat scanned;
lnat any_work;
diff --git a/rts/sm/Storage.c b/rts/sm/Storage.c
index 17798a25b8..18d317d446 100644
--- a/rts/sm/Storage.c
+++ b/rts/sm/Storage.c
@@ -496,22 +496,19 @@ allocNurseries (nat from, nat to)
assignNurseriesToCapabilities(from, to);
}
-lnat // words allocated
-clearNurseries (void)
+lnat
+clearNursery (Capability *cap)
{
- lnat allocated = 0;
- nat i;
bdescr *bd;
+ lnat allocated = 0;
- for (i = 0; i < n_capabilities; i++) {
- for (bd = nurseries[i].blocks; bd; bd = bd->link) {
- allocated += (lnat)(bd->free - bd->start);
- capabilities[i].total_allocated += (lnat)(bd->free - bd->start);
- bd->free = bd->start;
- ASSERT(bd->gen_no == 0);
- ASSERT(bd->gen == g0);
- IF_DEBUG(sanity,memset(bd->start, 0xaa, BLOCK_SIZE));
- }
+ for (bd = nurseries[cap->no].blocks; bd; bd = bd->link) {
+ allocated += (lnat)(bd->free - bd->start);
+ cap->total_allocated += (lnat)(bd->free - bd->start);
+ bd->free = bd->start;
+ ASSERT(bd->gen_no == 0);
+ ASSERT(bd->gen == g0);
+ IF_DEBUG(sanity,memset(bd->start, 0xaa, BLOCK_SIZE));
}
return allocated;
diff --git a/rts/sm/Storage.h b/rts/sm/Storage.h
index 44f39ee29b..9dffc18f2d 100644
--- a/rts/sm/Storage.h
+++ b/rts/sm/Storage.h
@@ -81,7 +81,7 @@ void dirty_MVAR(StgRegTable *reg, StgClosure *p);
extern nursery *nurseries;
void resetNurseries ( void );
-lnat clearNurseries ( void );
+lnat clearNursery ( Capability *cap );
void resizeNurseries ( nat blocks );
void resizeNurseriesFixed ( nat blocks );
lnat countNurseryBlocks ( void );