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(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;
|
||||
|
|
|
|||
Loading…
Reference in a new issue