diff --git a/mps/code/mpm.h b/mps/code/mpm.h index b27f29138ab..11b2cb0416e 100644 --- a/mps/code/mpm.h +++ b/mps/code/mpm.h @@ -358,7 +358,8 @@ extern void TraceDestroy(Trace trace); extern Res TraceAddWhite(Trace trace, Seg seg); extern Res TraceCondemnZones(Trace trace, ZoneSet condemnedSet); -extern void TraceStart(Trace trace, double mortality, double finishingTime); +extern void TraceStart(Trace trace, double mortality, + double finishingTime, int why); extern Size TracePoll(Globals globals); extern void TraceSegAccess(Arena arena, Seg seg, AccessSet mode); diff --git a/mps/code/trace.c b/mps/code/trace.c index 948df5fde40..914ccd368d8 100644 --- a/mps/code/trace.c +++ b/mps/code/trace.c @@ -1553,7 +1553,8 @@ static Res rootGrey(Root root, void *p) return ResOK; } -void TraceStart(Trace trace, double mortality, double finishingTime) +void TraceStart(Trace trace, double mortality, + double finishingTime, int why) { Arena arena; Message message; @@ -1569,6 +1570,12 @@ void TraceStart(Trace trace, double mortality, double finishingTime) arena = trace->arena; + DIAG_WRITEF(( DIAG_STREAM, "\n** TraceStart: $S\n", (WriteFS)trace->startMessage.why, NULL )); + if (why != TraceStartWhyCHAIN_GEN0CAP) { + /* a non-minor collection */ + DIAG( ArenaDescribe(arena, DIAG_STREAM); ); + } + message = TraceStartMessageMessage(&trace->startMessage); /* Attempt to re-use message. * @@@@ This is not done safely, because we fail to record @@ -1726,7 +1733,7 @@ static Res traceStartCollectAll(Trace *traceReturn, Arena arena, int why) /* Run out of time, should really try a smaller collection. @@@@ */ finishingTime = 0.0; } - TraceStart(trace, TraceTopGenMortality, finishingTime); + TraceStart(trace, TraceTopGenMortality, finishingTime, why); *traceReturn = trace; return ResOK; @@ -1791,16 +1798,17 @@ Size TracePoll(Globals globals) /* If one was found, start collection on that chain. */ if (firstTime < 0) { + int why = TraceStartWhyCHAIN_GEN0CAP; double mortality; - res = TraceCreate(&trace, arena, TraceStartWhyCHAIN_GEN0CAP); + res = TraceCreate(&trace, arena, why); AVER(res == ResOK); res = ChainCondemnAuto(&mortality, firstChain, trace); if (res != ResOK) /* should try some other trace, really @@@@ */ goto failCondemn; trace->chain = firstChain; ChainStartGC(firstChain, trace); - TraceStart(trace, mortality, trace->condemned * TraceWorkFactor); + TraceStart(trace, mortality, trace->condemned * TraceWorkFactor, why); scannedSize = traceWorkClock(trace); } } /* (dynamicDeferral > 0.0) */