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

Adding arena extension back to the arena allocation policy.

Copied from Perforce
 Change: 184280
 ServerID: perforce.ravenbrook.com
This commit is contained in:
Richard Brooksby 2014-01-31 22:42:02 +00:00
parent 070f7784dd
commit 35ccb414a2
5 changed files with 31 additions and 14 deletions

View file

@ -68,6 +68,7 @@ DEFINE_CLASS(AbstractArenaClass, class)
class->reserved = NULL;
class->spareCommitExceeded = ArenaNoSpareCommitExceeded;
class->extend = ArenaNoExtend;
class->grow = ArenaNoGrow;
class->alloc = NULL;
class->free = NULL;
class->chunkInit = NULL;
@ -702,14 +703,6 @@ failMark:
* can be maintained and adjusted.
*/
static Res arenaExtend(Arena arena, SegPref pref, Size size)
{
UNUSED(arena);
UNUSED(pref);
UNUSED(size);
return ResUNIMPL;
}
static Res arenaAllocPolicy(Tract *tractReturn, Arena arena, SegPref pref,
Size size, Pool pool)
{
@ -754,7 +747,7 @@ static Res arenaAllocPolicy(Tract *tractReturn, Arena arena, SegPref pref,
/* Plan C: Extend the arena, then try A and B again. */
if (moreZones != ZoneSetEMPTY) {
res = arenaExtend(arena, pref, size);
res = arena->class->grow(arena, pref, size);
if (res != ResOK)
return res;
zones = pref->zones;
@ -986,6 +979,15 @@ void ArenaNoSpareCommitExceeded(Arena arena)
}
Res ArenaNoGrow(Arena arena, SegPref pref, Size size)
{
AVERT(Arena, arena);
AVERT(SegPref, pref);
UNUSED(size);
return ResRESOURCE;
}
Size ArenaCommitLimit(Arena arena)
{
AVERT(Arena, arena);

View file

@ -1103,17 +1103,27 @@ static Bool pagesFindFreeWithSegPref(Index *baseReturn, VMChunk *chunkReturn,
}
return FALSE;
}
#endif
/* vmArenaExtend -- Extend the arena by making a new chunk
/* vmArenaGrow -- Extend the arena by making a new chunk
*
* The size arg specifies how much we wish to allocate after the extension.
*/
static Res vmArenaExtend(VMArena vmArena, Size size)
static Res vmArenaGrow(Arena arena, SegPref pref, Size size)
{
Chunk newChunk;
Size chunkSize;
Res res;
VMArena vmArena;
AVERT(Arena, arena);
vmArena = Arena2VMArena(arena);
AVERT(VMArena, vmArena);
/* TODO: Ensure that extended arena will be able to satisfy pref. */
AVERT(SegPref, pref);
UNUSED(pref);
/* Choose chunk size. */
/* .vmchunk.overhead: This code still lacks a proper estimate of */
@ -1170,12 +1180,12 @@ static Res vmArenaExtend(VMArena vmArena, Size size)
}
res = VMChunkCreate(&newChunk, vmArena, chunkSize);
if(res == ResOK)
goto vmArenaExtend_Done;
goto vmArenaGrow_Done;
}
}
}
vmArenaExtend_Done:
vmArenaGrow_Done:
EVENT2(vmArenaExtendDone, chunkSize, VMArenaReserved(VMArena2Arena(vmArena)));
vmArena->extended(VMArena2Arena(vmArena),
newChunk->base,
@ -1185,6 +1195,7 @@ vmArenaExtend_Done:
}
#if 0
/* VM*AllocPolicy -- allocation policy methods */
@ -1197,7 +1208,7 @@ static Res VMAllocPolicy(Index *baseIndexReturn, VMChunk *chunkReturn,
if (!pagesFindFreeWithSegPref(baseIndexReturn, chunkReturn,
vmArena, pref, size, FALSE)) {
/* try and extend, but don't worry if we can't */
(void)vmArenaExtend(vmArena, size);
(void)vmArenaGrow(vmArena, size);
/* We may or may not have a new chunk at this point */
/* we proceed to try the allocation again anyway. */
@ -1789,6 +1800,7 @@ DEFINE_ARENA_CLASS(VMArenaClass, this)
this->finish = VMArenaFinish;
this->reserved = VMArenaReserved;
this->spareCommitExceeded = VMArenaSpareCommitExceeded;
this->grow = vmArenaGrow;
this->alloc = VMAlloc;
this->free = VMFree;
this->chunkInit = VMChunkInit;

View file

@ -592,6 +592,7 @@ extern Res ArenaSetCommitLimit(Arena arena, Size limit);
extern Size ArenaSpareCommitLimit(Arena arena);
extern void ArenaSetSpareCommitLimit(Arena arena, Size limit);
extern void ArenaNoSpareCommitExceeded(Arena arena);
extern Res ArenaNoGrow(Arena arena, SegPref pref, Size size);
extern double ArenaMutatorAllocSize(Arena arena);
extern Size ArenaAvail(Arena arena);

View file

@ -542,6 +542,7 @@ typedef struct mps_arena_class_s {
ArenaReservedMethod reserved;
ArenaSpareCommitExceededMethod spareCommitExceeded;
ArenaExtendMethod extend;
ArenaGrowMethod grow;
ArenaAllocMethod alloc;
ArenaFreeMethod free;
ArenaChunkInitMethod chunkInit;

View file

@ -121,6 +121,7 @@ typedef void (*ArenaFinishMethod)(Arena arena);
typedef Size (*ArenaReservedMethod)(Arena arena);
typedef void (*ArenaSpareCommitExceededMethod)(Arena arena);
typedef Res (*ArenaExtendMethod)(Arena arena, Addr base, Size size);
typedef Res (*ArenaGrowMethod)(Arena arena, SegPref pref, Size size);
typedef Res (*ArenaAllocMethod)(Addr *baseReturn, Tract *baseTractReturn,
SegPref pref, Size size, Pool pool);
typedef void (*ArenaFreeMethod)(Addr base, Size size, Pool pool);