From a8720f2615a7538fb2ff3d689eea46723f324e04 Mon Sep 17 00:00:00 2001 From: Richard Brooksby Date: Sun, 23 Feb 2014 20:58:00 +0000 Subject: [PATCH] Adding cbssize and freelistsize functions to calculate the size of freelist contents. Copied from Perforce Change: 184466 ServerID: perforce.ravenbrook.com --- mps/code/cbs.c | 23 ++++++++++++++++++++++- mps/code/cbs.h | 2 ++ mps/code/freelist.c | 31 +++++++++++++++++++++++++++---- mps/code/freelist.h | 4 +++- mps/code/poolmv2.c | 5 ++--- 5 files changed, 56 insertions(+), 9 deletions(-) diff --git a/mps/code/cbs.c b/mps/code/cbs.c index d4363f44475..2db3c8e955c 100644 --- a/mps/code/cbs.c +++ b/mps/code/cbs.c @@ -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 . diff --git a/mps/code/cbs.h b/mps/code/cbs.h index 7ef712f6249..86364ed94c4 100644 --- a/mps/code/cbs.h +++ b/mps/code/cbs.h @@ -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 */ diff --git a/mps/code/freelist.c b/mps/code/freelist.c index 6260451ff59..d171345bd2b 100644 --- a/mps/code/freelist.c +++ b/mps/code/freelist.c @@ -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 . diff --git a/mps/code/freelist.h b/mps/code/freelist.h index 1bb9840c8c9..9624eba0e7e 100644 --- a/mps/code/freelist.h +++ b/mps/code/freelist.h @@ -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 */ diff --git a/mps/code/poolmv2.c b/mps/code/poolmv2.c index 27382a91b61..290005f6f89 100644 --- a/mps/code/poolmv2.c +++ b/mps/code/poolmv2.c @@ -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) {