diff --git a/mps/code/arenavm.c b/mps/code/arenavm.c index 2df8d7065b1..fae4419a3fa 100644 --- a/mps/code/arenavm.c +++ b/mps/code/arenavm.c @@ -1,7 +1,7 @@ /* arenavm.c: VIRTUAL MEMORY ARENA CLASS * * $Id$ - * Copyright (c) 2001-2013 Ravenbrook Limited. See end of file for license. + * Copyright (c) 2001-2014 Ravenbrook Limited. See end of file for license. * * * DESIGN @@ -909,6 +909,34 @@ static Bool pagesFindFreeWithSegPref(Index *baseReturn, VMChunk *chunkReturn, } +/* vmArenaChunkSize -- choose chunk size for arena extension + * + * .vmchunk.overhead: This code still lacks a proper estimate of + * the overhead required by a vmChunk for chunkStruct, page tables + * etc. For now, estimate it as 10%. RHSK 2007-12-21 + */ +static Size vmArenaChunkSize(VMArena vmArena, Size size) +{ + Size fraction = 10; /* 10% -- see .vmchunk.overhead */ + Size chunkSize; + Size chunkOverhead; + + /* 1: use extendBy, if it is big enough for size + overhead */ + chunkSize = vmArena->extendBy; + chunkOverhead = chunkSize / fraction; + if(chunkSize > size && (chunkSize - size) >= chunkOverhead) + return chunkSize; + + /* 2: use size + overhead (unless it overflows SizeMAX) */ + chunkOverhead = size / (fraction - 1); + if((SizeMAX - size) >= chunkOverhead) + return size + chunkOverhead; + + /* 3: use SizeMAX */ + return SizeMAX; +} + + /* vmArenaExtend -- Extend the arena by making a new chunk * * The size arg specifies how much we wish to allocate after the extension. @@ -919,31 +947,7 @@ static Res vmArenaExtend(VMArena vmArena, Size size) Size chunkSize; Res res; - /* Choose chunk size. */ - /* .vmchunk.overhead: This code still lacks a proper estimate of */ - /* the overhead required by a vmChunk for chunkStruct, page tables */ - /* etc. For now, estimate it as 10%. RHSK 2007-12-21 */ - do { - Size fraction = 10; /* 10% -- see .vmchunk.overhead */ - Size chunkOverhead; - - /* 1: use extendBy, if it is big enough for size + overhead */ - chunkSize = vmArena->extendBy; - chunkOverhead = chunkSize / fraction; - if(chunkSize > size && (chunkSize - size) >= chunkOverhead) - break; - - /* 2: use size + overhead (unless it overflows SizeMAX) */ - chunkOverhead = size / (fraction - 1); - if((SizeMAX - size) >= chunkOverhead) { - chunkSize = size + chunkOverhead; - break; - } - - /* 3: use SizeMAX */ - chunkSize = SizeMAX; - break; - } while(0); + chunkSize = vmArenaChunkSize(vmArena, size); EVENT3(vmArenaExtendStart, size, chunkSize, VMArenaReserved(VMArena2Arena(vmArena))); @@ -1571,7 +1575,7 @@ mps_arena_class_t mps_arena_class_vmnz(void) /* C. COPYRIGHT AND LICENSE * - * Copyright (C) 2001-2013 Ravenbrook Limited . + * Copyright (C) 2001-2014 Ravenbrook Limited . * All rights reserved. This is an open source license. Contact * Ravenbrook for commercial licensing options. *