diff options
-rw-r--r-- | rts/sm/GC.c | 14 | ||||
-rw-r--r-- | rts/sm/GCThread.h | 1 | ||||
-rw-r--r-- | rts/sm/Storage.c | 23 | ||||
-rw-r--r-- | rts/sm/Storage.h | 2 |
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 ); |