1
Fork 0
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:
Richard Brooksby 2014-02-23 20:58:00 +00:00
parent e502b4880a
commit a8720f2615
5 changed files with 56 additions and 9 deletions

View file

@ -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>.

View file

@ -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 */

View file

@ -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/>.

View file

@ -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 */

View file

@ -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) {