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:
parent
6b16beb0c6
commit
3b3e01b10f
4 changed files with 45 additions and 13 deletions
|
|
@ -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. */
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue