1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-04-27 16:51:06 -07:00

Simplifying segsetsummary by not requiring it to calculate the previous shield mode.

Copied from Perforce
 Change: 189963
 ServerID: perforce.ravenbrook.com
This commit is contained in:
Richard Brooksby 2016-03-13 14:09:38 +00:00
parent 47dbed0eee
commit ca73a994c0
2 changed files with 12 additions and 19 deletions

View file

@ -740,6 +740,7 @@ Bool SegCheck(Seg seg)
/* write shielded. */
/* CHECKL(seg->_summary == RefSetUNIV || (seg->_sm & AccessWRITE)); */
/* @@@@ What can be checked about the read barrier? */
/* FIXME: Need gcSegCheck? CHECKL(seg->defer == 0 || seg->summary == RefSetUNIV); */
}
return TRUE;
}
@ -1345,7 +1346,6 @@ static void gcSegSetRankSet(Seg seg, RankSet rankSet)
static void gcSegSetSummary(Seg seg, RefSet summary)
{
GCSeg gcseg;
RefSet oldSummary;
Arena arena;
AVERT_CRITICAL(Seg, seg); /* .seg.method.check */
@ -1354,19 +1354,16 @@ static void gcSegSetSummary(Seg seg, RefSet summary)
AVER_CRITICAL(&gcseg->segStruct == seg);
arena = PoolArena(SegPool(seg));
oldSummary = gcseg->summary;
gcseg->summary = summary;
AVER(seg->rankSet != RankSetEMPTY);
/* Note: !RefSetSuper is a test for a strict subset */
if (!RefSetSuper(summary, RefSetUNIV)) {
if (RefSetSuper(oldSummary, RefSetUNIV))
ShieldRaise(arena, seg, AccessWRITE);
} else {
if (!RefSetSuper(oldSummary, RefSetUNIV))
ShieldLower(arena, seg, AccessWRITE);
}
/* FIXME: Duplicate code with gcSegSetRankSummary. */
if (!RefSetSuper(summary, RefSetUNIV))
ShieldRaise(arena, seg, AccessWRITE);
else
ShieldLower(arena, seg, AccessWRITE);
}
@ -1375,7 +1372,6 @@ static void gcSegSetSummary(Seg seg, RefSet summary)
static void gcSegSetRankSummary(Seg seg, RankSet rankSet, RefSet summary)
{
GCSeg gcseg;
Bool wasShielded, willbeShielded;
Arena arena;
AVERT_CRITICAL(Seg, seg); /* .seg.method.check */
@ -1391,16 +1387,15 @@ static void gcSegSetRankSummary(Seg seg, RankSet rankSet, RefSet summary)
arena = PoolArena(SegPool(seg));
wasShielded = (seg->rankSet != RankSetEMPTY && gcseg->summary != RefSetUNIV);
willbeShielded = (rankSet != RankSetEMPTY && summary != RefSetUNIV);
seg->rankSet = BS_BITFIELD(Rank, rankSet);
gcseg->summary = summary;
if (willbeShielded && !wasShielded) {
ShieldRaise(arena, seg, AccessWRITE);
} else if (wasShielded && !willbeShielded) {
ShieldLower(arena, seg, AccessWRITE);
if (rankSet != RankSetEMPTY) {
/* FIXME: Duplicate code with gcSegSetSummary. */
if (!RefSetSuper(summary, RefSetUNIV))
ShieldRaise(arena, seg, AccessWRITE);
else
ShieldLower(arena, seg, AccessWRITE);
}
}

View file

@ -193,7 +193,6 @@ void (ShieldRaise) (Arena arena, Seg seg, AccessSet mode)
/* segs in the cache. */
AVERT(AccessSet, mode);
AVER((SegSM(seg) & mode) == AccessSetEMPTY);
SegSetSM(seg, SegSM(seg) | mode); /* inv.prot.shield preserved */
/* ensure inv.unsynced.suspended & inv.unsynced.depth */
@ -207,7 +206,6 @@ void (ShieldLower)(Arena arena, Seg seg, AccessSet mode)
{
/* Don't check seg or arena, see .seg.broken */
AVERT(AccessSet, mode);
AVER((SegSM(seg) & mode) == mode);
/* synced(seg) is not changed by the following
* preserving inv.unsynced.suspended
* Also inv.prot.shield preserved