mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-02-16 09:14:18 +00:00
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:
parent
e34e1bc58d
commit
13027dc8f4
1 changed files with 19 additions and 9 deletions
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue