From f041b8effed794bf80546f7aaef279fef063cc7b Mon Sep 17 00:00:00 2001 From: Tony Mann Date: Wed, 8 Dec 1999 17:57:05 +0000 Subject: [PATCH] Change.mps.dylan.kinglet.160189 - rework Copied from Perforce Change: 21022 ServerID: perforce.ravenbrook.com --- mps/src/trace.c | 51 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 38 insertions(+), 13 deletions(-) diff --git a/mps/src/trace.c b/mps/src/trace.c index 37df8729e9c..bb4ae0bff2c 100644 --- a/mps/src/trace.c +++ b/mps/src/trace.c @@ -1,6 +1,6 @@ /* impl.c.trace: GENERIC TRACER IMPLEMENTATION * - * $HopeName: MMsrc!trace.c(trunk.86) $ + * $HopeName: MMsrc!trace.c(trunk.87) $ * Copyright (C) 1999. Harlequin Limited. All rights reserved. * * .design: design.mps.trace. @@ -9,7 +9,7 @@ #include "mpm.h" -SRCID(trace, "$HopeName: MMsrc!trace.c(trunk.86) $"); +SRCID(trace, "$HopeName: MMsrc!trace.c(trunk.87) $"); /* Types @@ -1370,14 +1370,13 @@ Res TraceFix(ScanState ss, Ref *refIO) /* TractOfAddr is inlined, see design.mps.trace.fix.tractofaddr */ if(TRACT_OF_ADDR(&tract, ss->arena, ref)) { - Seg seg; - if (TRACT_SEG(&seg, tract)) { - STATISTIC(++ss->segRefCount); - EVENT_P(TraceFixSeg, seg); - if(TraceSetInter(TractWhite(tract), ss->traces) != TraceSetEMPTY) { + if(TraceSetInter(TractWhite(tract), ss->traces) != TraceSetEMPTY) { + Seg seg; + if (TRACT_SEG(&seg, tract)) { Res res; - + STATISTIC(++ss->segRefCount); STATISTIC(++ss->whiteSegRefCount); + EVENT_P(TraceFixSeg, seg); EVENT_0(TraceFixWhite); pool = TractPool(tract); /* Could move the rank switch here from the class-specific */ @@ -1386,7 +1385,20 @@ Res TraceFix(ScanState ss, Ref *refIO) if(res != ResOK) return res; } + + } else { + /* Tract isn't white. Don't compute seg for non-statistical */ + /* variety. See design.mps.trace.fix.tractofaddr */ + STATISTIC_STAT + ({ + Seg seg; + if (TRACT_SEG(&seg, tract)) { + ++ss->segRefCount; + EVENT_P(TraceFixSeg, seg); + } + }); } + } else { /* See design.mps.trace.exact.legal */ AVER(ss->rank < RankEXACT @@ -1416,17 +1428,30 @@ Res TraceFixEmergency(ScanState ss, Ref *refIO) /* TractOfAddr is inlined, see design.mps.trace.fix.tractofaddr */ if(TRACT_OF_ADDR(&tract, ss->arena, ref)) { - Seg seg; - if (TRACT_SEG(&seg, tract)) { - STATISTIC(++ss->segRefCount); - EVENT_P(TraceFixSeg, seg); - if(TraceSetInter(TractWhite(tract), ss->traces) != TraceSetEMPTY) { + if(TraceSetInter(TractWhite(tract), ss->traces) != TraceSetEMPTY) { + Seg seg; + if (TRACT_SEG(&seg, tract)) { + STATISTIC(++ss->segRefCount); STATISTIC(++ss->whiteSegRefCount); + EVENT_P(TraceFixSeg, seg); EVENT_0(TraceFixWhite); pool = TractPool(tract); PoolFixEmergency(pool, ss, seg, refIO); } + + } else { + /* Tract isn't white. Don't compute seg for non-statistical */ + /* variety. See design.mps.trace.fix.tractofaddr */ + STATISTIC_STAT + ({ + Seg seg; + if (TRACT_SEG(&seg, tract)) { + ++ss->segRefCount; + EVENT_P(TraceFixSeg, seg); + } + }); } + } else { /* See design.mps.trace.exact.legal */ AVER(ss->rank < RankEXACT ||