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.
This commit is contained in:
Helmut Eller 2026-02-11 09:42:47 +01:00
parent e34e1bc58d
commit 13027dc8f4

View file

@ -1143,18 +1143,27 @@ static Bool traceFindGrey(Seg *segReturn, Rank *rankReturn,
AVER(SegGrey(seg) != TraceSetEMPTY); AVER(SegGrey(seg) != TraceSetEMPTY);
AVER(RankSetIsMember(SegRankSet(seg), rank)); AVER(RankSetIsMember(SegRankSet(seg), rank));
if(TraceSetIsMember(SegGrey(seg), trace)) { if (TraceSetIsMember(SegGrey(seg), trace)) {
if (TraceSetIsMember(seg->propagationNeeded,
trace)) {
tracePropagateToLowerRanks (trace, arena);
band = trace->band;
goto bandstart;
}
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 */ /* .check.band.weak */
AVER(band != RankWEAK || rank == band); AVER(band != RankWEAK || rank == band);
if(rank != band) { if (rank != band) {
traceBandFirstStretchDone(trace); traceBandFirstStretchDone(trace);
} else { } else {
/* .check.final.one-pass */ /* .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. */ /* Only scan a segment if it refers to the white set. */
if(ZoneSetInter(white, SegSummary(seg)) == ZoneSetEMPTY) { if(ZoneSetInter(white, SegSummary(seg)) == ZoneSetEMPTY) {
AVER(seg->propagationNeeded == TraceSetEMPTY);
SegBlacken(seg, ts); SegBlacken(seg, ts);
/* Setup result code to return later. */ /* Setup result code to return later. */
res = ResOK; res = ResOK;