mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-04-27 16:51:06 -07:00
Adding cbssize and freelistsize functions to calculate the size of freelist contents.
Copied from Perforce Change: 184466 ServerID: perforce.ravenbrook.com
This commit is contained in:
parent
e502b4880a
commit
a8720f2615
5 changed files with 56 additions and 9 deletions
|
|
@ -744,7 +744,8 @@ static void cbsFindDeleteRange(Range rangeReturn, Range oldRangeReturn,
|
|||
deleted from one end of the block, so cbsDeleteFromTree did not
|
||||
need to allocate a new block. */
|
||||
AVER(res == ResOK);
|
||||
}
|
||||
} else
|
||||
RangeFinish(oldRangeReturn);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -863,6 +864,26 @@ Bool CBSFindLargest(Range rangeReturn, Range oldRangeReturn,
|
|||
}
|
||||
|
||||
|
||||
/* CBSSize -- calculate the total size of blocks in the CBS */
|
||||
|
||||
static Bool CBSSizeIterate(CBS cbs, Range range, void *closureP, Size closureS)
|
||||
{
|
||||
Size *sizeP = closureP;
|
||||
UNUSED(cbs);
|
||||
UNUSED(closureS);
|
||||
*sizeP += RangeSize(range);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
Size CBSSize(CBS cbs)
|
||||
{
|
||||
Size size = 0;
|
||||
AVERT(CBS, cbs);
|
||||
CBSIterate(cbs, CBSSizeIterate, &size, 0);
|
||||
return size;
|
||||
}
|
||||
|
||||
|
||||
/* CBSDescribe -- describe a CBS
|
||||
*
|
||||
* See <design/cbs/#function.cbs.describe>.
|
||||
|
|
|
|||
|
|
@ -55,6 +55,8 @@ extern Bool CBSFindLast(Range rangeReturn, Range oldRangeReturn,
|
|||
extern Bool CBSFindLargest(Range rangeReturn, Range oldRangeReturn,
|
||||
CBS cbs, Size size, FindDelete findDelete);
|
||||
|
||||
extern Size CBSSize(CBS cbs);
|
||||
|
||||
|
||||
#endif /* cbs_h */
|
||||
|
||||
|
|
|
|||
|
|
@ -201,7 +201,7 @@ static void freelistBlockSetPrevNext(Freelist fl, FreelistBlock prev,
|
|||
}
|
||||
|
||||
|
||||
Res FreelistInsert(Range rangeReturn, Freelist fl, Range range)
|
||||
void FreelistInsert(Range rangeReturn, Freelist fl, Range range)
|
||||
{
|
||||
FreelistBlock prev, cur, next, new;
|
||||
Addr base, limit;
|
||||
|
|
@ -218,8 +218,10 @@ Res FreelistInsert(Range rangeReturn, Freelist fl, Range range)
|
|||
prev = NULL;
|
||||
cur = fl->list;
|
||||
while (cur) {
|
||||
if (base < FreelistBlockLimit(fl, cur) && FreelistBlockBase(cur) < limit)
|
||||
return ResFAIL; /* range overlaps with cur */
|
||||
if (base < FreelistBlockLimit(fl, cur) && FreelistBlockBase(cur) < limit) {
|
||||
NOTREACHED; /* range overlaps with cur */
|
||||
return; /* defensive ignore */
|
||||
}
|
||||
if (limit <= FreelistBlockBase(cur))
|
||||
break;
|
||||
next = FreelistBlockNext(cur);
|
||||
|
|
@ -262,7 +264,6 @@ Res FreelistInsert(Range rangeReturn, Freelist fl, Range range)
|
|||
}
|
||||
|
||||
RangeInit(rangeReturn, base, limit);
|
||||
return ResOK;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -624,6 +625,28 @@ void FreelistFlushToCBS(Freelist fl, CBS cbs)
|
|||
}
|
||||
|
||||
|
||||
/* FreelistSize -- calculate the total size of blocks in the freelist */
|
||||
|
||||
static Bool FreelistSizeVisitor(Bool *deleteReturn,
|
||||
Range range,
|
||||
void *closureP, Size closureS)
|
||||
{
|
||||
Size *sizeP = closureP;
|
||||
UNUSED(closureS);
|
||||
*sizeP += RangeSize(range);
|
||||
deleteReturn = FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
Size FreelistSize(Freelist fl)
|
||||
{
|
||||
Size size = 0;
|
||||
AVERT(Freelist, fl);
|
||||
FreelistIterate(fl, FreelistSizeVisitor, &size, 0);
|
||||
return size;
|
||||
}
|
||||
|
||||
|
||||
/* C. COPYRIGHT AND LICENSE
|
||||
*
|
||||
* Copyright (C) 2013 Ravenbrook Limited <http://www.ravenbrook.com/>.
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ extern Bool FreelistCheck(Freelist fl);
|
|||
extern Res FreelistInit(Freelist fl, Align alignment);
|
||||
extern void FreelistFinish(Freelist fl);
|
||||
|
||||
extern Res FreelistInsert(Range rangeReturn, Freelist fl, Range range);
|
||||
extern void FreelistInsert(Range rangeReturn, Freelist fl, Range range);
|
||||
extern Res FreelistDelete(Range rangeReturn, Freelist fl, Range range);
|
||||
extern Res FreelistDescribe(Freelist fl, mps_lib_FILE *stream);
|
||||
|
||||
|
|
@ -48,6 +48,8 @@ extern Bool FreelistFindLargest(Range rangeReturn, Range oldRangeReturn,
|
|||
|
||||
extern void FreelistFlushToCBS(Freelist fl, CBS cbs);
|
||||
|
||||
extern Size FreelistSize(Freelist fl);
|
||||
|
||||
#endif /* freelist.h */
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -825,9 +825,8 @@ static Res MVTInsert(MVT mvt, Addr base, Addr limit)
|
|||
if (ResIsAllocFailure(res)) {
|
||||
/* CBS ran out of memory for splay nodes: add range to emergency
|
||||
* free list instead. */
|
||||
res = FreelistInsert(&newRange, MVTFreelist(mvt), &range);
|
||||
}
|
||||
if (res != ResOK)
|
||||
FreelistInsert(&newRange, MVTFreelist(mvt), &range);
|
||||
} else
|
||||
return res;
|
||||
|
||||
if (RangeSize(&newRange) >= mvt->reuseSize) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue