mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-16 19:00:55 -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:
parent
726ba1d25a
commit
2020da56a6
11 changed files with 76 additions and 54 deletions
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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 */
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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)) {
|
||||||
|
|
|
||||||
|
|
@ -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 */
|
||||||
|
|
|
||||||
|
|
@ -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));
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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,8 +859,16 @@ 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* segNoSetBuffer -- non-method to set the buffer of a segment */
|
||||||
|
|
||||||
|
static void segNoUnsetBuffer(Seg seg)
|
||||||
|
{
|
||||||
|
AVERT(Seg, seg);
|
||||||
NOTREACHED;
|
NOTREACHED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -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.
|
||||||
|
|
@ -1641,7 +1662,8 @@ DEFINE_CLASS(Seg, Seg, klass)
|
||||||
klass->finish = SegAbsFinish;
|
klass->finish = SegAbsFinish;
|
||||||
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;
|
||||||
|
|
@ -1666,7 +1688,8 @@ DEFINE_CLASS(Seg, GCSeg, klass)
|
||||||
klass->finish = gcSegFinish;
|
klass->finish = gcSegFinish;
|
||||||
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;
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue