Commit de910f06 authored by simonmar's avatar simonmar

[project @ 2006-01-12 14:42:25 by simonmar]

+RTS -S: replace "collected" with "copied", which is more useful.
+RTS -Dg: print size of mutable list, and breakdown by type of closure
(MUT_VAR, MUT_ARR, others).
parent 7b414bae
......@@ -140,6 +140,14 @@ static lnat g0s0_pcnt_kept = 30; // percentage of g0s0 live at last minor GC
static lnat thunk_selector_depth = 0;
#define MAX_THUNK_SELECTOR_DEPTH 8
/* Mut-list stats */
#ifdef DEBUG
static nat
mutlist_MUTVARS,
mutlist_MUTARRS,
mutlist_OTHERS;
#endif
/* -----------------------------------------------------------------------------
Static function declarations
-------------------------------------------------------------------------- */
......@@ -332,7 +340,7 @@ GarbageCollect ( void (*get_roots)(evac_fn), rtsBool force_major_gc )
{
bdescr *bd;
step *stp;
lnat live, allocated, collected = 0, copied = 0, scavd_copied = 0;
lnat live, allocated, copied = 0, scavd_copied = 0;
lnat oldgen_saved_blocks = 0;
nat g, s, i;
......@@ -363,6 +371,12 @@ GarbageCollect ( void (*get_roots)(evac_fn), rtsBool force_major_gc )
memInventory();
#endif
#ifdef DEBUG
mutlist_MUTVARS = 0;
mutlist_MUTARRS = 0;
mutlist_OTHERS = 0;
#endif
// Init stats and print par specific (timing) info
PAR_TICKY_PAR_START();
......@@ -792,9 +806,13 @@ GarbageCollect ( void (*get_roots)(evac_fn), rtsBool force_major_gc )
// Count the mutable list as bytes "copied" for the purposes of
// stats. Every mutable list is copied during every GC.
if (g > 0) {
nat mut_list_size = 0;
for (bd = generations[g].mut_list; bd != NULL; bd = bd->link) {
copied += bd->free - bd->start;
mut_list_size += bd->free - bd->start;
}
copied += mut_list_size;
IF_DEBUG(gc, debugBelch("mut_list_size: %d (%d vars, %d arrays, %d others)\n", mut_list_size * sizeof(W_), mutlist_MUTVARS, mutlist_MUTARRS, mutlist_OTHERS));
}
for (s = 0; s < generations[g].n_steps; s++) {
......@@ -813,18 +831,6 @@ GarbageCollect ( void (*get_roots)(evac_fn), rtsBool force_major_gc )
// for generations we collected...
if (g <= N) {
// rough calculation of garbage collected, for stats output
if (stp->is_compacted) {
collected += (oldgen_saved_blocks - stp->n_old_blocks) * BLOCK_SIZE_W;
} else {
if (g == 0 && s == 0) {
collected += countNurseryBlocks() * BLOCK_SIZE_W;
collected += alloc_blocks;
} else {
collected += stp->n_old_blocks * BLOCK_SIZE_W;
}
}
/* free old memory and shift to-space into from-space for all
* the collected steps (except the allocation area). These
* freed blocks will probaby be quickly recycled.
......@@ -1175,7 +1181,7 @@ GarbageCollect ( void (*get_roots)(evac_fn), rtsBool force_major_gc )
#endif
// ok, GC over: tell the stats department what happened.
stat_endGC(allocated, collected, live, copied, scavd_copied, N);
stat_endGC(allocated, live, copied, scavd_copied, N);
#if defined(RTS_USER_SIGNALS)
// unblock signals again
......@@ -3834,6 +3840,20 @@ scavenge_mutable_list(generation *gen)
for (q = bd->start; q < bd->free; q++) {
p = (StgPtr)*q;
ASSERT(LOOKS_LIKE_CLOSURE_PTR(p));
#ifdef DEBUG
switch (get_itbl((StgClosure *)p)->type) {
case MUT_VAR:
mutlist_MUTVARS++; break;
case MUT_ARR_PTRS:
case MUT_ARR_PTRS_FROZEN:
case MUT_ARR_PTRS_FROZEN0:
mutlist_MUTARRS++; break;
default:
mutlist_OTHERS++; break;
}
#endif
if (scavenge_one(p)) {
/* didn't manage to promote everything, so put the
* object back on the list.
......
......@@ -126,7 +126,7 @@ initStats(void)
nat i;
if (RtsFlags.GcFlags.giveStats >= VERBOSE_GC_STATS) {
statsPrintf(" Alloc Collect Live GC GC TOT TOT Page Flts\n");
statsPrintf(" Alloc Copied Live GC GC TOT TOT Page Flts\n");
statsPrintf(" bytes bytes bytes user elap user elap\n");
}
GC_coll_times =
......@@ -251,7 +251,7 @@ stat_startGC(void)
-------------------------------------------------------------------------- */
void
stat_endGC (lnat alloc, lnat collect, lnat live, lnat copied,
stat_endGC (lnat alloc, lnat live, lnat copied,
lnat scavd_copied, lnat gen)
{
if (RtsFlags.GcFlags.giveStats != NO_GC_STATS) {
......@@ -265,7 +265,7 @@ stat_endGC (lnat alloc, lnat collect, lnat live, lnat copied,
nat faults = getPageFaults();
statsPrintf("%9ld %9ld %9ld",
alloc*sizeof(W_), collect*sizeof(W_), live*sizeof(W_));
alloc*sizeof(W_), copied*sizeof(W_), live*sizeof(W_));
statsPrintf(" %5.2f %5.2f %7.2f %7.2f %4ld %4ld (Gen: %2ld)\n",
TICK_TO_DBL(gc_time),
TICK_TO_DBL(gc_etime),
......
......@@ -15,7 +15,7 @@ void stat_startInit(void);
void stat_endInit(void);
void stat_startGC(void);
void stat_endGC (lnat alloc, lnat collect, lnat live,
void stat_endGC (lnat alloc, lnat live,
lnat copied, lnat scavd_copied, lnat gen);
#ifdef PROFILING
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment