mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-19 12:20:17 -08:00
Attach the pools using a format to a ring in the format, so that when we destroy the format, we can check that no pools are using it.
Copied from Perforce Change: 187253 ServerID: perforce.ravenbrook.com
This commit is contained in:
parent
33aeb61e59
commit
f65f1db83e
9 changed files with 22 additions and 1 deletions
|
|
@ -22,6 +22,7 @@ Bool FormatCheck(Format format)
|
|||
CHECKU(Arena, format->arena);
|
||||
CHECKL(format->serial < format->arena->formatSerial);
|
||||
CHECKD_NOSIG(Ring, &format->arenaRing);
|
||||
CHECKD_NOSIG(Ring, &format->poolRing);
|
||||
CHECKL(AlignCheck(format->alignment));
|
||||
/* TODO: Define the concept of the maximum alignment it is possible to
|
||||
request from the MPS, document and provide an interface to it, and then
|
||||
|
|
@ -141,6 +142,7 @@ Res FormatCreate(Format *formatReturn, Arena arena, ArgList args)
|
|||
|
||||
format->arena = arena;
|
||||
RingInit(&format->arenaRing);
|
||||
RingInit(&format->poolRing);
|
||||
format->alignment = fmtAlign;
|
||||
format->headerSize = fmtHeaderSize;
|
||||
format->scan = fmtScan;
|
||||
|
|
@ -168,12 +170,14 @@ Res FormatCreate(Format *formatReturn, Arena arena, ArgList args)
|
|||
void FormatDestroy(Format format)
|
||||
{
|
||||
AVERT(Format, format);
|
||||
AVER(RingIsSingle(&format->poolRing));
|
||||
|
||||
RingRemove(&format->arenaRing);
|
||||
|
||||
format->sig = SigInvalid;
|
||||
|
||||
RingFinish(&format->arenaRing);
|
||||
RingFinish(&format->poolRing);
|
||||
|
||||
ControlFree(format->arena, format, sizeof(FormatStruct));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -110,6 +110,7 @@ typedef struct mps_pool_s { /* generic structure */
|
|||
RingStruct segRing; /* segs are attached to pool */
|
||||
Align alignment; /* alignment for units */
|
||||
Format format; /* format only if class->attr&AttrFMT */
|
||||
RingStruct formatRing; /* link in list of pools using format */
|
||||
PoolFixMethod fix; /* fix method */
|
||||
double fillMutatorSize; /* bytes filled, mutator buffers */
|
||||
double emptyMutatorSize; /* bytes emptied, mutator buffers */
|
||||
|
|
@ -410,6 +411,7 @@ typedef struct mps_fmt_s {
|
|||
Serial serial; /* from arena->formatSerial */
|
||||
Arena arena; /* owning arena */
|
||||
RingStruct arenaRing; /* formats are attached to the arena */
|
||||
RingStruct poolRing; /* ring of pools using the format */
|
||||
Align alignment; /* alignment of formatted objects */
|
||||
mps_fmt_scan_t scan;
|
||||
mps_fmt_skip_t skip;
|
||||
|
|
|
|||
|
|
@ -153,6 +153,7 @@ Res PoolInit(Pool pool, Arena arena, PoolClass class, ArgList args)
|
|||
RingInit(&pool->arenaRing);
|
||||
RingInit(&pool->bufferRing);
|
||||
RingInit(&pool->segRing);
|
||||
RingInit(&pool->formatRing);
|
||||
pool->bufferSerial = (Serial)0;
|
||||
pool->alignment = MPS_PF_ALIGN;
|
||||
pool->format = NULL;
|
||||
|
|
@ -181,6 +182,7 @@ Res PoolInit(Pool pool, Arena arena, PoolClass class, ArgList args)
|
|||
|
||||
failInit:
|
||||
pool->sig = SigInvalid; /* Leave arena->poolSerial incremented */
|
||||
RingFinish(&pool->formatRing);
|
||||
RingFinish(&pool->segRing);
|
||||
RingFinish(&pool->bufferRing);
|
||||
RingFinish(&pool->arenaRing);
|
||||
|
|
@ -237,10 +239,14 @@ void PoolFinish(Pool pool)
|
|||
/* Do any class-specific finishing. */
|
||||
(*pool->class->finish)(pool);
|
||||
|
||||
/* Detach the pool from the arena, and unsig it. */
|
||||
/* Detach the pool from the arena and format, and unsig it. */
|
||||
RingRemove(&pool->arenaRing);
|
||||
if (pool->format) {
|
||||
RingRemove(&pool->formatRing);
|
||||
}
|
||||
pool->sig = SigInvalid;
|
||||
|
||||
RingFinish(&pool->formatRing);
|
||||
RingFinish(&pool->segRing);
|
||||
RingFinish(&pool->bufferRing);
|
||||
RingFinish(&pool->arenaRing);
|
||||
|
|
|
|||
|
|
@ -832,6 +832,7 @@ static Res amcInitComm(Pool pool, RankSet rankSet, ArgList args)
|
|||
|
||||
ArgRequire(&arg, args, MPS_KEY_FORMAT);
|
||||
pool->format = arg.val.format;
|
||||
RingAppend(&pool->format->poolRing, &pool->formatRing);
|
||||
if (ArgPick(&arg, args, MPS_KEY_CHAIN))
|
||||
chain = arg.val.chain;
|
||||
else
|
||||
|
|
|
|||
|
|
@ -838,6 +838,7 @@ Res AMSInitInternal(AMS ams, Format format, Chain chain, unsigned gen,
|
|||
pool = AMSPool(ams);
|
||||
AVERT(Pool, pool);
|
||||
pool->format = format;
|
||||
RingAppend(&format->poolRing, &pool->formatRing);
|
||||
pool->alignment = pool->format->alignment;
|
||||
ams->grainShift = SizeLog2(PoolAlignment(pool));
|
||||
|
||||
|
|
|
|||
|
|
@ -576,6 +576,7 @@ static Res AWLInit(Pool pool, ArgList args)
|
|||
|
||||
AVERT(Format, format);
|
||||
pool->format = format;
|
||||
RingAppend(&format->poolRing, &pool->formatRing);
|
||||
pool->alignment = format->alignment;
|
||||
|
||||
AVER(FUNCHECK(findDependent));
|
||||
|
|
|
|||
|
|
@ -494,6 +494,7 @@ static Res LOInit(Pool pool, ArgList args)
|
|||
|
||||
ArgRequire(&arg, args, MPS_KEY_FORMAT);
|
||||
pool->format = arg.val.format;
|
||||
RingAppend(&pool->format->poolRing, &pool->formatRing);
|
||||
if (ArgPick(&arg, args, MPS_KEY_CHAIN))
|
||||
chain = arg.val.chain;
|
||||
else {
|
||||
|
|
|
|||
|
|
@ -388,6 +388,7 @@ static Res SNCInit(Pool pool, ArgList args)
|
|||
|
||||
AVERT(Format, format);
|
||||
pool->format = format;
|
||||
RingAppend(&format->poolRing, &pool->formatRing);
|
||||
snc->freeSegs = NULL;
|
||||
snc->sig = SNCSig;
|
||||
|
||||
|
|
|
|||
|
|
@ -4,6 +4,10 @@ TEST_HEADER
|
|||
summary = destroy a format though attached to a pool
|
||||
language = c
|
||||
link = testlib.o
|
||||
OUTPUT_SPEC
|
||||
assert = true
|
||||
assertfile P= format.c
|
||||
assertcond = RingIsSingle(&format->poolRing)
|
||||
END_HEADER
|
||||
*/
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue