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:
parent
070f7784dd
commit
35ccb414a2
5 changed files with 31 additions and 14 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -542,6 +542,7 @@ typedef struct mps_arena_class_s {
|
|||
ArenaReservedMethod reserved;
|
||||
ArenaSpareCommitExceededMethod spareCommitExceeded;
|
||||
ArenaExtendMethod extend;
|
||||
ArenaGrowMethod grow;
|
||||
ArenaAllocMethod alloc;
|
||||
ArenaFreeMethod free;
|
||||
ArenaChunkInitMethod chunkInit;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue