1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-17 03:10:58 -08:00

Replacing segbuffer with version that returns bool and the buffer, and disallowing null to segsetbuffer, adding setunsetbuffer for that case instead.

Copied from Perforce
 Change: 191695
 ServerID: perforce.ravenbrook.com
This commit is contained in:
Richard Brooksby 2016-04-27 15:47:26 +01:00
parent 726ba1d25a
commit 2020da56a6
11 changed files with 76 additions and 54 deletions

View file

@ -1174,11 +1174,8 @@ static void segBufAttach(Buffer buffer, Addr base, Addr limit,
static void segBufDetach(Buffer buffer) static void segBufDetach(Buffer buffer)
{ {
SegBuf segbuf = MustBeA(SegBuf, buffer); SegBuf segbuf = MustBeA(SegBuf, buffer);
Seg seg; Seg seg = segbuf->seg;
SegUnsetBuffer(seg);
seg = segbuf->seg;
AVER(seg != NULL);
SegSetBuffer(seg, NULL);
segbuf->seg = NULL; segbuf->seg = NULL;
} }

View file

@ -672,9 +672,9 @@ extern Res SegSplit(Seg *segLoReturn, Seg *segHiReturn, Seg seg, Addr at);
extern Res SegDescribe(Seg seg, mps_lib_FILE *stream, Count depth); extern Res SegDescribe(Seg seg, mps_lib_FILE *stream, Count depth);
extern void SegSetSummary(Seg seg, RefSet summary); extern void SegSetSummary(Seg seg, RefSet summary);
extern Bool SegHasBuffer(Seg seg); extern Bool SegHasBuffer(Seg seg);
extern Bool SegGetBuffer(Buffer *bufferReturn, Seg seg); extern Bool SegBuffer(Buffer *bufferReturn, Seg seg);
extern Buffer SegBuffer(Seg seg);
extern void SegSetBuffer(Seg seg, Buffer buffer); extern void SegSetBuffer(Seg seg, Buffer buffer);
extern void SegUnsetBuffer(Seg seg);
extern Addr SegBufferScanLimit(Seg seg); extern Addr SegBufferScanLimit(Seg seg);
extern Bool SegCheck(Seg seg); extern Bool SegCheck(Seg seg);
extern Bool GCSegCheck(GCSeg gcseg); extern Bool GCSegCheck(GCSeg gcseg);

View file

@ -225,6 +225,7 @@ typedef struct SegClassStruct {
SegSetSummaryMethod setSummary; /* set the segment summary */ SegSetSummaryMethod setSummary; /* set the segment summary */
SegBufferMethod buffer; /* get the segment buffer */ SegBufferMethod buffer; /* get the segment buffer */
SegSetBufferMethod setBuffer; /* set the segment buffer */ SegSetBufferMethod setBuffer; /* set the segment buffer */
SegUnsetBufferMethod unsetBuffer; /* unset the segment buffer */
SegSetGreyMethod setGrey; /* change greyness of segment */ SegSetGreyMethod setGrey; /* change greyness of segment */
SegSetWhiteMethod setWhite; /* change whiteness of segment */ SegSetWhiteMethod setWhite; /* change whiteness of segment */
SegSetRankSetMethod setRankSet; /* change rank set of segment */ SegSetRankSetMethod setRankSet; /* change rank set of segment */

View file

@ -160,8 +160,9 @@ typedef void (*SegSetRankSetMethod)(Seg seg, RankSet rankSet);
typedef void (*SegSetRankSummaryMethod)(Seg seg, RankSet rankSet, typedef void (*SegSetRankSummaryMethod)(Seg seg, RankSet rankSet,
RefSet summary); RefSet summary);
typedef void (*SegSetSummaryMethod)(Seg seg, RefSet summary); typedef void (*SegSetSummaryMethod)(Seg seg, RefSet summary);
typedef Buffer (*SegBufferMethod)(Seg seg); typedef Bool (*SegBufferMethod)(Buffer *bufferReturn, Seg seg);
typedef void (*SegSetBufferMethod)(Seg seg, Buffer buffer); typedef void (*SegSetBufferMethod)(Seg seg, Buffer buffer);
typedef void (*SegUnsetBufferMethod)(Seg seg);
typedef Res (*SegDescribeMethod)(Seg seg, mps_lib_FILE *stream, Count depth); typedef Res (*SegDescribeMethod)(Seg seg, mps_lib_FILE *stream, Count depth);
typedef Res (*SegMergeMethod)(Seg seg, Seg segHi, typedef Res (*SegMergeMethod)(Seg seg, Seg segHi,
Addr base, Addr mid, Addr limit); Addr base, Addr mid, Addr limit);

View file

@ -197,7 +197,7 @@ static void AMCSegSketch(Seg seg, char *pbSketch, size_t cbSketch)
pbSketch[2] = 'W'; /* White */ pbSketch[2] = 'W'; /* White */
} }
if (!SegGetBuffer(&buffer, seg)) { if (!SegBuffer(&buffer, seg)) {
pbSketch[3] = '_'; pbSketch[3] = '_';
} else { } else {
Bool mut = BufferIsMutator(buffer); Bool mut = BufferIsMutator(buffer);
@ -284,7 +284,7 @@ static Res AMCSegDescribe(Seg seg, mps_lib_FILE *stream, Count depth)
if(res != ResOK) if(res != ResOK)
return res; return res;
if (SegGetBuffer(&buffer, seg)) if (SegBuffer(&buffer, seg))
init = BufferGetInit(buffer); init = BufferGetInit(buffer);
else else
init = limit; init = limit;
@ -1111,7 +1111,7 @@ static Res AMCWhiten(Pool pool, Trace trace, Seg seg)
AVERT(Trace, trace); AVERT(Trace, trace);
if (SegGetBuffer(&buffer, seg)) { if (SegBuffer(&buffer, seg)) {
AVERT(Buffer, buffer); AVERT(Buffer, buffer);
if(!BufferIsMutator(buffer)) { /* forwarding buffer */ if(!BufferIsMutator(buffer)) { /* forwarding buffer */
@ -1269,7 +1269,7 @@ static Res amcScanNailedOnce(Bool *totalReturn, Bool *moreReturn,
NailboardClearNewNails(board); NailboardClearNewNails(board);
p = SegBase(seg); p = SegBase(seg);
while (SegGetBuffer(&buffer, seg)) { while (SegBuffer(&buffer, seg)) {
limit = BufferScanLimit(buffer); limit = BufferScanLimit(buffer);
if(p >= limit) { if(p >= limit) {
AVER(p == limit); AVER(p == limit);
@ -1370,7 +1370,7 @@ static Res AMCScan(Bool *totalReturn, ScanState ss, Pool pool, Seg seg)
base = AddrAdd(SegBase(seg), format->headerSize); base = AddrAdd(SegBase(seg), format->headerSize);
/* <design/poolamc/#seg-scan.loop> */ /* <design/poolamc/#seg-scan.loop> */
while (SegGetBuffer(&buffer, seg)) { while (SegBuffer(&buffer, seg)) {
limit = AddrAdd(BufferScanLimit(buffer), limit = AddrAdd(BufferScanLimit(buffer),
format->headerSize); format->headerSize);
if(base >= limit) { if(base >= limit) {
@ -1907,7 +1907,7 @@ static Res AMCAddrObject(Addr *pReturn, Pool pool, Seg seg, Addr addr)
arena = PoolArena(pool); arena = PoolArena(pool);
base = SegBase(seg); base = SegBase(seg);
if (SegGetBuffer(&buffer, seg)) { if (SegBuffer(&buffer, seg)) {
/* We use BufferGetInit here (and not BufferScanLimit) because we /* We use BufferGetInit here (and not BufferScanLimit) because we
* want to be able to find objects that have been allocated and * want to be able to find objects that have been allocated and
* committed since the last flip. These objects lie between the * committed since the last flip. These objects lie between the

View file

@ -543,7 +543,7 @@ static Res AMSSegDescribe(Seg seg, mps_lib_FILE *stream, Count depth)
if (res != ResOK) if (res != ResOK)
return res; return res;
hasBuffer = SegGetBuffer(&buffer, seg); hasBuffer = SegBuffer(&buffer, seg);
res = WriteF(stream, depth, res = WriteF(stream, depth,
" AMS $P\n", (WriteFP)amsseg->ams, " AMS $P\n", (WriteFP)amsseg->ams,
@ -1143,7 +1143,7 @@ static Res AMSWhiten(Pool pool, Trace trace, Seg seg)
amsseg->allocTableInUse = TRUE; amsseg->allocTableInUse = TRUE;
} }
if (SegGetBuffer(&buffer, seg)) { /* <design/poolams/#condemn.buffer> */ if (SegBuffer(&buffer, seg)) { /* <design/poolams/#condemn.buffer> */
Index scanLimitIndex, limitIndex; Index scanLimitIndex, limitIndex;
scanLimitIndex = AMS_ADDR_INDEX(seg, BufferScanLimit(buffer)); scanLimitIndex = AMS_ADDR_INDEX(seg, BufferScanLimit(buffer));
limitIndex = AMS_ADDR_INDEX(seg, BufferLimit(buffer)); limitIndex = AMS_ADDR_INDEX(seg, BufferLimit(buffer));
@ -1230,7 +1230,7 @@ static Res amsIterate(Seg seg, AMSObjectFunction f, void *closure)
p = SegBase(seg); p = SegBase(seg);
limit = SegLimit(seg); limit = SegLimit(seg);
hasBuffer = SegGetBuffer(&buffer, seg); hasBuffer = SegBuffer(&buffer, seg);
while (p < limit) { /* loop over the objects in the segment */ while (p < limit) { /* loop over the objects in the segment */
if (hasBuffer && p == BufferScanLimit(buffer) && p != BufferLimit(buffer)) { if (hasBuffer && p == BufferScanLimit(buffer) && p != BufferLimit(buffer)) {

View file

@ -724,7 +724,7 @@ static Res AWLWhiten(Pool pool, Trace trace, Seg seg)
/* see <design/poolawl/#fun.condemn> */ /* see <design/poolawl/#fun.condemn> */
AVER(SegWhite(seg) == TraceSetEMPTY); AVER(SegWhite(seg) == TraceSetEMPTY);
if (!SegGetBuffer(&buffer, seg)) { if (!SegBuffer(&buffer, seg)) {
awlRangeWhiten(awlseg, 0, awlseg->grains); awlRangeWhiten(awlseg, 0, awlseg->grains);
uncondemnedGrains = (Count)0; uncondemnedGrains = (Count)0;
} else { } else {
@ -792,7 +792,7 @@ static void AWLGrey(Pool pool, Trace trace, Seg seg)
AWLSeg awlseg = MustBeA(AWLSeg, seg); AWLSeg awlseg = MustBeA(AWLSeg, seg);
SegSetGrey(seg, TraceSetAdd(SegGrey(seg), trace)); SegSetGrey(seg, TraceSetAdd(SegGrey(seg), trace));
if (SegGetBuffer(&buffer, seg)) { if (SegBuffer(&buffer, seg)) {
Addr base = SegBase(seg); Addr base = SegBase(seg);
AWLRangeGrey(awlseg, AWLRangeGrey(awlseg,
@ -880,7 +880,7 @@ static Res awlScanSinglePass(Bool *anyScannedReturn,
*anyScannedReturn = FALSE; *anyScannedReturn = FALSE;
p = base; p = base;
if (SegGetBuffer(&buffer, seg) && BufferScanLimit(buffer) != BufferLimit(buffer)) if (SegBuffer(&buffer, seg) && BufferScanLimit(buffer) != BufferLimit(buffer))
bufferScanLimit = BufferScanLimit(buffer); bufferScanLimit = BufferScanLimit(buffer);
else else
bufferScanLimit = limit; bufferScanLimit = limit;
@ -1029,7 +1029,7 @@ static void AWLReclaim(Pool pool, Trace trace, Seg seg)
AWLSeg awlseg = MustBeA(AWLSeg, seg); AWLSeg awlseg = MustBeA(AWLSeg, seg);
Addr base = SegBase(seg); Addr base = SegBase(seg);
Buffer buffer; Buffer buffer;
Bool hasBuffer = SegGetBuffer(&buffer, seg); Bool hasBuffer = SegBuffer(&buffer, seg);
Format format = pool->format; Format format = pool->format;
Count reclaimedGrains = (Count)0; Count reclaimedGrains = (Count)0;
Count preservedInPlaceCount = (Count)0; Count preservedInPlaceCount = (Count)0;
@ -1162,7 +1162,7 @@ static void AWLWalk(Pool pool, Seg seg, FormattedObjectsVisitor f,
Index i; Index i;
Buffer buffer; Buffer buffer;
if (SegGetBuffer(&buffer, seg)) { if (SegBuffer(&buffer, seg)) {
if (object == BufferScanLimit(buffer) if (object == BufferScanLimit(buffer)
&& BufferScanLimit(buffer) != BufferLimit(buffer)) { && BufferScanLimit(buffer) != BufferLimit(buffer)) {
/* skip over buffered area */ /* skip over buffered area */

View file

@ -313,7 +313,7 @@ static void loSegReclaim(LOSeg loseg, Trace trace)
p = base; p = base;
while(p < limit) { while(p < limit) {
Buffer buffer; Buffer buffer;
Bool hasBuffer = SegGetBuffer(&buffer, seg); Bool hasBuffer = SegBuffer(&buffer, seg);
Addr q; Addr q;
Index i; Index i;
@ -406,7 +406,7 @@ static void LOWalk(Pool pool, Seg seg, FormattedObjectsVisitor f,
Index j; Index j;
Buffer buffer; Buffer buffer;
if (SegGetBuffer(&buffer, seg)) { if (SegBuffer(&buffer, seg)) {
if(object == BufferScanLimit(buffer) && if(object == BufferScanLimit(buffer) &&
BufferScanLimit(buffer) != BufferLimit(buffer)) { BufferScanLimit(buffer) != BufferLimit(buffer)) {
/* skip over buffered area */ /* skip over buffered area */
@ -659,7 +659,7 @@ static Res LOWhiten(Pool pool, Trace trace, Seg seg)
grains = loSegGrains(loseg); grains = loSegGrains(loseg);
/* Whiten allocated objects; leave free areas black. */ /* Whiten allocated objects; leave free areas black. */
if (SegGetBuffer(&buffer, seg)) { if (SegBuffer(&buffer, seg)) {
Addr base = SegBase(seg); Addr base = SegBase(seg);
Index scanLimitIndex = loIndexOfAddr(base, lo, BufferScanLimit(buffer)); Index scanLimitIndex = loIndexOfAddr(base, lo, BufferScanLimit(buffer));
Index limitIndex = loIndexOfAddr(base, lo, BufferLimit(buffer)); Index limitIndex = loIndexOfAddr(base, lo, BufferLimit(buffer));

View file

@ -568,7 +568,7 @@ static Res SNCFramePop(Pool pool, Buffer buf, AllocFrame frame)
AVER(foundSeg); AVER(foundSeg);
AVER(SegPool(seg) == pool); AVER(SegPool(seg) == pool);
if (SegGetBuffer(&segBuf, seg) && segBuf == buf) { if (SegBuffer(&segBuf, seg) && segBuf == buf) {
/* don't need to change the segment - just the alloc pointers */ /* don't need to change the segment - just the alloc pointers */
AVER(addr <= BufferScanLimit(buf)); /* check direction of pop */ AVER(addr <= BufferScanLimit(buf)); /* check direction of pop */
BufferSetAllocAddr(buf, addr); BufferSetAllocAddr(buf, addr);

View file

@ -336,27 +336,17 @@ void SegSetRankAndSummary(Seg seg, RankSet rankSet, RefSet summary)
Bool SegHasBuffer(Seg seg) Bool SegHasBuffer(Seg seg)
{ {
return SegBuffer(seg) != NULL; Buffer buffer;
return SegBuffer(&buffer, seg);
} }
/* SegBuffer -- return the buffer of a segment */ /* SegBuffer -- get the buffer of a segment */
Buffer SegBuffer(Seg seg) Bool SegBuffer(Buffer *bufferReturn, Seg seg)
{ {
AVERT_CRITICAL(Seg, seg); /* .seg.critical */ AVERT_CRITICAL(Seg, seg); /* .seg.critical */
return Method(Seg, seg, buffer)(seg); return Method(Seg, seg, buffer)(bufferReturn, seg);
}
Bool SegGetBuffer(Buffer *bufferReturn, Seg seg)
{
Buffer buffer = SegBuffer(seg);
if (buffer != NULL) {
*bufferReturn = buffer;
return TRUE;
}
return FALSE;
} }
@ -365,12 +355,20 @@ Bool SegGetBuffer(Buffer *bufferReturn, Seg seg)
void SegSetBuffer(Seg seg, Buffer buffer) void SegSetBuffer(Seg seg, Buffer buffer)
{ {
AVERT(Seg, seg); AVERT(Seg, seg);
if (buffer != NULL)
AVERT(Buffer, buffer); AVERT(Buffer, buffer);
Method(Seg, seg, setBuffer)(seg, buffer); Method(Seg, seg, setBuffer)(seg, buffer);
} }
/* SegUnsetBuffer -- remove the buffer from a segment */
void SegUnsetBuffer(Seg seg)
{
AVERT(Seg, seg);
Method(Seg, seg, unsetBuffer)(seg);
}
/* SegBufferScanLimit -- limit of scannable objects in segment */ /* SegBufferScanLimit -- limit of scannable objects in segment */
Addr SegBufferScanLimit(Seg seg) Addr SegBufferScanLimit(Seg seg)
@ -380,7 +378,7 @@ Addr SegBufferScanLimit(Seg seg)
AVERT(Seg, seg); AVERT(Seg, seg);
if (!SegGetBuffer(&buf, seg)) { if (!SegBuffer(&buf, seg)) {
/* Segment is unbuffered: entire segment scannable */ /* Segment is unbuffered: entire segment scannable */
limit = SegLimit(seg); limit = SegLimit(seg);
} else { } else {
@ -665,7 +663,7 @@ Res SegSplit(Seg *segLoReturn, Seg *segHiReturn, Seg seg, Addr at)
/* Can only split a buffered segment if the entire buffer is below /* Can only split a buffered segment if the entire buffer is below
* the split point. */ * the split point. */
AVER(!SegGetBuffer(&buffer, seg) || BufferLimit(buffer) <= at); AVER(!SegBuffer(&buffer, seg) || BufferLimit(buffer) <= at);
if (seg->queued) if (seg->queued)
ShieldFlush(arena); /* see <design/seg/#split-merge.shield> */ ShieldFlush(arena); /* see <design/seg/#split-merge.shield> */
@ -847,11 +845,12 @@ static void segNoSetRankSummary(Seg seg, RankSet rankSet, RefSet summary)
/* segNoBuffer -- non-method to return the buffer of a segment */ /* segNoBuffer -- non-method to return the buffer of a segment */
static Buffer segNoBuffer(Seg seg) static Bool segNoBuffer(Buffer *bufferReturn, Seg seg)
{ {
AVERT(Seg, seg); AVERT(Seg, seg);
AVER(bufferReturn != NULL);
NOTREACHED; NOTREACHED;
return NULL; return FALSE;
} }
@ -860,12 +859,20 @@ static Buffer segNoBuffer(Seg seg)
static void segNoSetBuffer(Seg seg, Buffer buffer) static void segNoSetBuffer(Seg seg, Buffer buffer)
{ {
AVERT(Seg, seg); AVERT(Seg, seg);
if (buffer != NULL)
AVERT(Buffer, buffer); AVERT(Buffer, buffer);
NOTREACHED; NOTREACHED;
} }
/* segNoSetBuffer -- non-method to set the buffer of a segment */
static void segNoUnsetBuffer(Seg seg)
{
AVERT(Seg, seg);
NOTREACHED;
}
/* segNoMerge -- merge method for segs which don't support merge */ /* segNoMerge -- merge method for segs which don't support merge */
@ -1401,7 +1408,7 @@ static void gcSegSetRankSummary(Seg seg, RankSet rankSet, RefSet summary)
/* gcSegBuffer -- GCSeg method to return the buffer of a segment */ /* gcSegBuffer -- GCSeg method to return the buffer of a segment */
static Buffer gcSegBuffer(Seg seg) static Bool gcSegBuffer(Buffer *bufferReturn, Seg seg)
{ {
GCSeg gcseg; GCSeg gcseg;
@ -1410,7 +1417,12 @@ static Buffer gcSegBuffer(Seg seg)
AVERT_CRITICAL(GCSeg, gcseg); /* .seg.method.check */ AVERT_CRITICAL(GCSeg, gcseg); /* .seg.method.check */
AVER_CRITICAL(&gcseg->segStruct == seg); AVER_CRITICAL(&gcseg->segStruct == seg);
return gcseg->buffer; if (gcseg->buffer != NULL) {
*bufferReturn = gcseg->buffer;
return TRUE;
}
return FALSE;
} }
@ -1431,6 +1443,15 @@ static void gcSegSetBuffer(Seg seg, Buffer buffer)
} }
/* gcSegUnsetBuffer -- GCSeg method to remove the buffer from a segment */
static void gcSegUnsetBuffer(Seg seg)
{
GCSeg gcseg = MustBeA_CRITICAL(GCSeg, seg); /* .seg.method.check */
gcseg->buffer = NULL;
}
/* gcSegMerge -- GCSeg merge method /* gcSegMerge -- GCSeg merge method
* *
* .buffer: Can't merge two segments both with buffers. * .buffer: Can't merge two segments both with buffers.
@ -1642,6 +1663,7 @@ DEFINE_CLASS(Seg, Seg, klass)
klass->setSummary = segNoSetSummary; klass->setSummary = segNoSetSummary;
klass->buffer = segNoBuffer; klass->buffer = segNoBuffer;
klass->setBuffer = segNoSetBuffer; klass->setBuffer = segNoSetBuffer;
klass->unsetBuffer = segNoUnsetBuffer;
klass->setGrey = segNoSetGrey; klass->setGrey = segNoSetGrey;
klass->setWhite = segNoSetWhite; klass->setWhite = segNoSetWhite;
klass->setRankSet = segNoSetRankSet; klass->setRankSet = segNoSetRankSet;
@ -1667,6 +1689,7 @@ DEFINE_CLASS(Seg, GCSeg, klass)
klass->setSummary = gcSegSetSummary; klass->setSummary = gcSegSetSummary;
klass->buffer = gcSegBuffer; klass->buffer = gcSegBuffer;
klass->setBuffer = gcSegSetBuffer; klass->setBuffer = gcSegSetBuffer;
klass->unsetBuffer = gcSegUnsetBuffer;
klass->setGrey = gcSegSetGrey; klass->setGrey = gcSegSetGrey;
klass->setWhite = gcSegSetWhite; klass->setWhite = gcSegSetWhite;
klass->setRankSet = gcSegSetRankSet; klass->setRankSet = gcSegSetRankSet;

View file

@ -603,7 +603,7 @@ static void AMSTStressBufferedSeg(Seg seg, Buffer buffer)
AVERT(Seg, seg); AVERT(Seg, seg);
AVERT(Buffer, buffer); AVERT(Buffer, buffer);
AVER(SegGetBuffer(&segBuf, seg) && segBuf == buffer); AVER(SegBuffer(&segBuf, seg) && segBuf == buffer);
amstseg = Seg2AMSTSeg(seg); amstseg = Seg2AMSTSeg(seg);
AVERT(AMSTSeg, amstseg); AVERT(AMSTSeg, amstseg);
limit = BufferLimit(buffer); limit = BufferLimit(buffer);