1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-03-26 00:34:17 -07:00

Converting arena finish and describe methods to specialize instfinish and instdescribe.

Copied from Perforce
 Change: 191614
 ServerID: perforce.ravenbrook.com
This commit is contained in:
Richard Brooksby 2016-04-23 16:30:08 +01:00
parent 66f9fe6841
commit 139c44155b
5 changed files with 20 additions and 28 deletions

View file

@ -43,8 +43,8 @@ static void ArenaTrivCompact(Arena arena, Trace trace);
static void arenaFreePage(Arena arena, Addr base, Pool pool);
static void arenaFreeLandFinish(Arena arena);
static Res ArenaAbsInit(Arena arena, Size grainSize, ArgList args);
static void ArenaAbsFinish(Arena arena);
static Res ArenaAbsDescribe(Arena arena, mps_lib_FILE *stream, Count depth);
static void ArenaAbsFinish(Inst inst);
static Res ArenaAbsDescribe(Inst inst, mps_lib_FILE *stream, Count depth);
static void ArenaNoFree(Addr base, Size size, Pool pool)
@ -107,10 +107,11 @@ DEFINE_CLASS(Inst, ArenaClass, klass)
DEFINE_CLASS(Arena, AbstractArena, klass)
{
INHERIT_CLASS(&klass->protocol, AbstractArena, Inst);
klass->protocol.finish = ArenaAbsFinish;
klass->protocol.describe = ArenaAbsDescribe;
klass->size = sizeof(ArenaStruct);
klass->varargs = ArgTrivVarargs;
klass->init = ArenaAbsInit;
klass->finish = ArenaAbsFinish;
klass->create = ArenaNoCreate;
klass->destroy = ArenaNoDestroy;
klass->purgeSpare = ArenaNoPurgeSpare;
@ -120,7 +121,6 @@ DEFINE_CLASS(Arena, AbstractArena, klass)
klass->chunkInit = ArenaNoChunkInit;
klass->chunkFinish = ArenaNoChunkFinish;
klass->compact = ArenaTrivCompact;
klass->describe = ArenaAbsDescribe;
klass->pagesMarkAllocated = ArenaNoPagesMarkAllocated;
klass->sig = ArenaClassSig;
}
@ -134,7 +134,6 @@ Bool ArenaClassCheck(ArenaClass klass)
CHECKL(klass->size >= sizeof(ArenaStruct));
CHECKL(FUNCHECK(klass->varargs));
CHECKL(FUNCHECK(klass->init));
CHECKL(FUNCHECK(klass->finish));
CHECKL(FUNCHECK(klass->create));
CHECKL(FUNCHECK(klass->destroy));
CHECKL(FUNCHECK(klass->purgeSpare));
@ -144,7 +143,6 @@ Bool ArenaClassCheck(ArenaClass klass)
CHECKL(FUNCHECK(klass->chunkInit));
CHECKL(FUNCHECK(klass->chunkFinish));
CHECKL(FUNCHECK(klass->compact));
CHECKL(FUNCHECK(klass->describe));
CHECKL(FUNCHECK(klass->pagesMarkAllocated));
CHECKS(ArenaClass, klass);
return TRUE;
@ -406,19 +404,15 @@ failInit:
}
/* ArenaAbsFinish -- finish the generic part of the arena
*
* .finish.caller: Unlike PoolFinish, this is called by the class finish
* methods, not the generic Destroy. This is because the class is
* responsible for deallocating the descriptor.
*/
/* ArenaAbsFinish -- finish the generic part of the arena */
static void ArenaAbsFinish(Arena arena)
static void ArenaAbsFinish(Inst inst)
{
Arena arena = MustBeA(AbstractArena, inst);
AVERC(Arena, arena);
PoolFinish(ArenaCBSBlockPool(arena));
arena->sig = SigInvalid;
InstFinish(MustBeA(Inst, arena));
NextMethod(Inst, AbstractArena, finish)(inst);
GlobalsFinish(ArenaGlobals(arena));
LocusFinish(arena);
RingFinish(ArenaChunkRing(arena));
@ -510,8 +504,9 @@ void ControlFinish(Arena arena)
/* ArenaDescribe -- describe the arena */
static Res ArenaAbsDescribe(Arena arena, mps_lib_FILE *stream, Count depth)
static Res ArenaAbsDescribe(Inst inst, mps_lib_FILE *stream, Count depth)
{
Arena arena = CouldBeA(AbstractArena, inst);
Res res;
if (!TESTC(AbstractArena, arena))
@ -565,7 +560,7 @@ static Res ArenaAbsDescribe(Arena arena, mps_lib_FILE *stream, Count depth)
Res ArenaDescribe(Arena arena, mps_lib_FILE *stream, Count depth)
{
return Method(Arena, arena, describe)(arena, stream, depth);
return Method(Inst, arena, describe)(MustBeA(Inst, arena), stream, depth);
}

View file

@ -311,7 +311,7 @@ static Res ClientArenaCreate(Arena *arenaReturn, ArgList args)
return ResOK;
failChunkCreate:
NextMethod(Arena, ClientArena, finish)(arena);
NextMethod(Inst, ClientArena, finish)(MustBeA(Inst, arena));
failSuperInit:
AVER(res != ResOK);
return res;
@ -336,7 +336,7 @@ static void ClientArenaDestroy(Arena arena)
AVER(arena->reserved == 0);
AVER(arena->committed == 0);
NextMethod(Arena, ClientArena, finish)(arena); /* <code/arena.c#finish.caller> */
NextMethod(Inst, ClientArena, finish)(MustBeA(Inst, arena));
}

View file

@ -187,17 +187,18 @@ static Bool VMArenaCheck(VMArena vmArena)
/* VMArenaDescribe -- describe the VMArena
*/
static Res VMArenaDescribe(Arena arena, mps_lib_FILE *stream, Count depth)
static Res VMArenaDescribe(Inst inst, mps_lib_FILE *stream, Count depth)
{
Res res;
Arena arena = CouldBeA(AbstractArena, inst);
VMArena vmArena = CouldBeA(VMArena, arena);
Res res;
if (!TESTC(VMArena, vmArena))
return ResPARAM;
if (stream == NULL)
return ResPARAM;
res = NextMethod(Arena, VMArena, describe)(arena, stream, depth);
res = NextMethod(Inst, VMArena, describe)(inst, stream, depth);
if (res != ResOK)
return res;
@ -666,7 +667,7 @@ static Res VMArenaCreate(Arena *arenaReturn, ArgList args)
return ResOK;
failChunkCreate:
NextMethod(Arena, VMArena, finish)(arena);
NextMethod(Inst, VMArena, finish)(MustBeA(Inst, arena));
failArenaInit:
VMUnmap(vm, VMBase(vm), VMLimit(vm));
failVMMap:
@ -701,7 +702,7 @@ static void VMArenaDestroy(Arena arena)
vmArena->sig = SigInvalid;
NextMethod(Arena, VMArena, finish)(arena); /* <code/global.c#finish.caller> */
NextMethod(Inst, VMArena, finish)(MustBeA(Inst, arena));
/* Copy VM descriptor to stack-local storage so that we can continue
* using the descriptor after the VM has been unmapped. */
@ -1195,6 +1196,7 @@ mps_res_t mps_arena_vm_growth(mps_arena_t mps_arena,
DEFINE_CLASS(Arena, VMArena, klass)
{
INHERIT_CLASS(klass, VMArena, AbstractArena);
klass->protocol.describe = VMArenaDescribe;
klass->size = sizeof(VMArenaStruct);
klass->varargs = VMArenaVarargs;
klass->create = VMArenaCreate;
@ -1205,7 +1207,6 @@ DEFINE_CLASS(Arena, VMArena, klass)
klass->chunkInit = VMChunkInit;
klass->chunkFinish = VMChunkFinish;
klass->compact = VMCompact;
klass->describe = VMArenaDescribe;
klass->pagesMarkAllocated = VMPagesMarkAllocated;
}

View file

@ -494,7 +494,6 @@ typedef struct mps_arena_class_s {
size_t size; /* size of outer structure */
ArenaVarargsMethod varargs;
ArenaInitMethod init;
ArenaFinishMethod finish;
ArenaCreateMethod create;
ArenaDestroyMethod destroy;
ArenaPurgeSpareMethod purgeSpare;
@ -504,7 +503,6 @@ typedef struct mps_arena_class_s {
ArenaChunkInitMethod chunkInit;
ArenaChunkFinishMethod chunkFinish;
ArenaCompactMethod compact;
ArenaDescribeMethod describe;
ArenaPagesMarkAllocatedMethod pagesMarkAllocated;
Sig sig;
} ArenaClassStruct;

View file

@ -114,7 +114,6 @@ typedef void (*ArenaVarargsMethod)(ArgStruct args[], va_list varargs);
typedef Res (*ArenaCreateMethod)(Arena *arenaReturn, ArgList args);
typedef void (*ArenaDestroyMethod)(Arena arena);
typedef Res (*ArenaInitMethod)(Arena arena, Size grainSize, ArgList args);
typedef void (*ArenaFinishMethod)(Arena arena);
typedef Size (*ArenaPurgeSpareMethod)(Arena arena, Size size);
typedef Res (*ArenaExtendMethod)(Arena arena, Addr base, Size size);
typedef Res (*ArenaGrowMethod)(Arena arena, LocusPref pref, Size size);
@ -122,7 +121,6 @@ typedef void (*ArenaFreeMethod)(Addr base, Size size, Pool pool);
typedef Res (*ArenaChunkInitMethod)(Chunk chunk, BootBlock boot);
typedef void (*ArenaChunkFinishMethod)(Chunk chunk);
typedef void (*ArenaCompactMethod)(Arena arena, Trace trace);
typedef Res (*ArenaDescribeMethod)(Arena arena, mps_lib_FILE *stream, Count depth);
typedef Res (*ArenaPagesMarkAllocatedMethod)(Arena arena, Chunk chunk,
Index baseIndex, Count pages,
Pool pool);