From 13027dc8f4dac528a791177828905725ec7380bb Mon Sep 17 00:00:00 2001 From: Helmut Eller Date: Wed, 11 Feb 2026 09:42:47 +0100 Subject: [PATCH] Add another workaround for the ephemeron pool Disabling write barrier deferral in config.h, uncovered a second problem: mps/test/function/eph1.c fails because segments aren't scanned if the segment's summary doesn't intersect with the white set. * mps/code/trace.c (traceFindGrey): Force rescanning by adding the white set to the segments summary. --- mps/code/trace.c | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/mps/code/trace.c b/mps/code/trace.c index cc768f19dd6..92665471248 100644 --- a/mps/code/trace.c +++ b/mps/code/trace.c @@ -1143,18 +1143,27 @@ static Bool traceFindGrey(Seg *segReturn, Rank *rankReturn, AVER(SegGrey(seg) != TraceSetEMPTY); AVER(RankSetIsMember(SegRankSet(seg), rank)); - if(TraceSetIsMember(SegGrey(seg), trace)) { - - if (TraceSetIsMember(seg->propagationNeeded, - trace)) { - tracePropagateToLowerRanks (trace, arena); - band = trace->band; - goto bandstart; - } + if (TraceSetIsMember(SegGrey(seg), trace)) { + if (TraceSetIsMember(seg->propagationNeeded, trace)) { + tracePropagateToLowerRanks(trace, arena); + AVER(!TraceSetIsMember(seg->propagationNeeded, trace)); + /* HACK: traceScanSegRes skips segments for which the + summary doesn't intersect with the white set. Including + the white set in the summary here, forces as rescan of + the segment. */ + if (ZoneSetInter(trace->white, SegSummary(seg)) == + ZoneSetEMPTY) + SegSetSummary(seg, + RefSetUnion(SegSummary(seg), trace->white)); + AVER(ZoneSetInter(trace->white, SegSummary(seg)) != + ZoneSetEMPTY); + band = trace->band; + goto bandstart; + } /* .check.band.weak */ AVER(band != RankWEAK || rank == band); - if(rank != band) { + if (rank != band) { traceBandFirstStretchDone(trace); } else { /* .check.final.one-pass */ @@ -1260,6 +1269,7 @@ static Res traceScanSegRes(TraceSet ts, Rank rank, Arena arena, Seg seg) /* Only scan a segment if it refers to the white set. */ if(ZoneSetInter(white, SegSummary(seg)) == ZoneSetEMPTY) { + AVER(seg->propagationNeeded == TraceSetEMPTY); SegBlacken(seg, ts); /* Setup result code to return later. */ res = ResOK;