1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-15 10:30:25 -08:00

Searching the freecbs now respects the “high” preference, though not yet within blocks.

Copied from Perforce
 Change: 184574
 ServerID: perforce.ravenbrook.com
This commit is contained in:
Richard Brooksby 2014-02-26 19:29:05 +00:00
parent 6b16beb0c6
commit 3b3e01b10f
4 changed files with 45 additions and 13 deletions

View file

@ -967,16 +967,21 @@ static Bool arenaAllocFindInZoneCBS(Range rangeReturn,
}
static Bool arenaAllocFindInFreeCBS(Range rangeReturn,
Arena arena, ZoneSet zones, Size size)
Arena arena, ZoneSet zones, Bool high,
Size size)
{
Res res;
RangeStruct oldRange, restRange;
Addr allocLimit, stripeLimit, oldLimit, limit;
Index zone;
CBS zoneCBS;
res = CBSFindFirstInZones(rangeReturn, &oldRange, &arena->freeCBS, size,
arena, zones);
if (high)
res = CBSFindLastInZones(rangeReturn, &oldRange, &arena->freeCBS, size,
arena, zones);
else
res = CBSFindFirstInZones(rangeReturn, &oldRange, &arena->freeCBS, size,
arena, zones);
if (res == ResLIMIT) { /* CBS block pool full */
RangeStruct pageRange;
@ -1043,7 +1048,7 @@ static Res arenaAllocFromCBS(Tract *tractReturn, ZoneSet zones, Bool high,
zoneCBSs, but this probably isn't a win. */
if (!arenaAllocFindInZoneCBS(&range, arena, zones, high, size))
if (!arenaAllocFindInFreeCBS(&range, arena, zones, size))
if (!arenaAllocFindInFreeCBS(&range, arena, zones, high, size))
return ResRESOURCE;
/* Step 2. Make memory available in the address space range. */

View file

@ -803,6 +803,8 @@ static Bool cbsTestNodeInZones(SplayTree tree, SplayNode node,
UNUSED(tree);
AVER(closureSize == sizeof(cbsTestNodeInZonesClosureStruct));
UNUSED(closureSize);
/* FIXME: RangeInZoneSet needs to work in both directions. */
return CBSBlockSize(block) >= closure->size &&
RangeInZoneSet(&closure->base, &closure->limit,
@ -810,9 +812,11 @@ static Bool cbsTestNodeInZones(SplayTree tree, SplayNode node,
closure->arena, closure->zoneSet, closure->size);
}
Res CBSFindFirstInZones(Range rangeReturn, Range oldRangeReturn,
CBS cbs, Size size,
Arena arena, ZoneSet zoneSet)
static Res CBSFindInZones(Range rangeReturn, Range oldRangeReturn,
CBS cbs, Size size,
Arena arena, ZoneSet zoneSet,
CBSFindMethod cbsFind,
SplayFindMethod splayFind)
{
SplayNode node;
cbsTestNodeInZonesClosureStruct closure;
@ -823,7 +827,7 @@ Res CBSFindFirstInZones(Range rangeReturn, Range oldRangeReturn,
if (zoneSet == ZoneSetEMPTY)
return ResFAIL;
if (zoneSet == ZoneSetUNIV)
return CBSFindFirst(rangeReturn, oldRangeReturn, cbs, size, FindDeleteLOW);
return cbsFind(rangeReturn, oldRangeReturn, cbs, size, FindDeleteLOW);
if (ZoneSetIsSingle(zoneSet)) {
if (size > ArenaStripeSize(arena))
return ResFAIL;
@ -849,10 +853,10 @@ Res CBSFindFirstInZones(Range rangeReturn, Range oldRangeReturn,
closure.arena = arena;
closure.zoneSet = zoneSet;
closure.size = size;
if (SplayFindFirst(&node, splayTreeOfCBS(cbs),
&cbsTestNodeInZones,
&cbsTestTree,
&closure, sizeof(closure))) {
if (splayFind(&node, splayTreeOfCBS(cbs),
&cbsTestNodeInZones,
&cbsTestTree,
&closure, sizeof(closure))) {
CBSBlock block = cbsBlockOfSplayNode(node);
RangeStruct rangeStruct, oldRangeStruct;
@ -874,6 +878,22 @@ Res CBSFindFirstInZones(Range rangeReturn, Range oldRangeReturn,
return res;
}
Res CBSFindFirstInZones(Range rangeReturn, Range oldRangeReturn,
CBS cbs, Size size,
Arena arena, ZoneSet zoneSet)
{
return CBSFindInZones(rangeReturn, oldRangeReturn, cbs, size,
arena, zoneSet, CBSFindFirst, SplayFindFirst);
}
Res CBSFindLastInZones(Range rangeReturn, Range oldRangeReturn,
CBS cbs, Size size,
Arena arena, ZoneSet zoneSet)
{
return CBSFindInZones(rangeReturn, oldRangeReturn, cbs, size,
arena, zoneSet, CBSFindLast, SplayFindLast);
}
/* CBSFindLast -- find the last block of at least the given size */

View file

@ -59,6 +59,9 @@ extern Bool CBSFindLargest(Range rangeReturn, Range oldRangeReturn,
extern Res CBSFindFirstInZones(Range rangeReturn, Range oldRangeReturn,
CBS cbs, Size size,
Arena arena, ZoneSet zoneSet);
extern Res CBSFindLastInZones(Range rangeReturn, Range oldRangeReturn,
CBS cbs, Size size,
Arena arena, ZoneSet zoneSet);
#endif /* cbs_h */

View file

@ -64,6 +64,10 @@ extern SplayNode SplayTreeFirst(SplayTree tree, void *zeroKey);
extern SplayNode SplayTreeNext(SplayTree tree, SplayNode oldNode,
void *oldKey);
typedef Bool (*SplayFindMethod)(SplayNode *nodeReturn, SplayTree tree,
SplayTestNodeMethod testNode,
SplayTestTreeMethod testTree,
void *closureP, Size closureS);
extern Bool SplayFindFirst(SplayNode *nodeReturn, SplayTree tree,
SplayTestNodeMethod testNode,
SplayTestTreeMethod testTree,