aboutsummaryrefslogtreecommitdiffstats
path: root/mps/code
diff options
context:
space:
mode:
authorGareth Rees2013-06-03 16:16:04 +0100
committerGareth Rees2013-06-03 16:16:04 +0100
commitca36e1a1479304525892ff81622a6931b678abe2 (patch)
tree50b456cf4f90c67a1886276ca5bf82baa6606bce /mps/code
parentbe868669e31773ce7082ee4f2a6758d78aed8d59 (diff)
downloademacs-ca36e1a1479304525892ff81622a6931b678abe2.tar.gz
emacs-ca36e1a1479304525892ff81622a6931b678abe2.zip
Cbsdelete() now returns the isolated contiguous range that was found, even if the requested deletion operation cannot be performed. (this is so that the caller can try deleting the whole block instead and manage the fragments using a fallback strategy.)
CBSFindLargest() takes a size argument, so that the caller doesn't have to re-insert the found block if it wasn't large enough. Copied from Perforce Change: 182431 ServerID: perforce.ravenbrook.com
Diffstat (limited to 'mps/code')
-rw-r--r--mps/code/cbs.c32
-rw-r--r--mps/code/cbs.h2
2 files changed, 18 insertions, 16 deletions
diff --git a/mps/code/cbs.c b/mps/code/cbs.c
index b235ec3da51..809bd340c23 100644
--- a/mps/code/cbs.c
+++ b/mps/code/cbs.c
@@ -536,6 +536,7 @@ static Res cbsDeleteFromTree(Range rangeReturn, CBS cbs, Range range)
536 oldBase = cbsBlock->base; 536 oldBase = cbsBlock->base;
537 oldLimit = cbsBlock->limit; 537 oldLimit = cbsBlock->limit;
538 oldSize = CBSBlockSize(cbsBlock); 538 oldSize = CBSBlockSize(cbsBlock);
539 RangeInit(rangeReturn, oldBase, oldLimit);
539 540
540 if (base == oldBase && limit == oldLimit) { 541 if (base == oldBase && limit == oldLimit) {
541 /* entire block */ 542 /* entire block */
@@ -570,7 +571,6 @@ static Res cbsDeleteFromTree(Range rangeReturn, CBS cbs, Range range)
570 cbsBlockInsert(cbs, newBlock); 571 cbsBlockInsert(cbs, newBlock);
571 } 572 }
572 573
573 RangeInit(rangeReturn, oldBase, oldLimit);
574 return ResOK; 574 return ResOK;
575 575
576failAlloc: 576failAlloc:
@@ -830,7 +830,7 @@ Bool CBSFindLast(Range rangeReturn, Range oldRangeReturn,
830/* CBSFindLargest -- find the largest block in the CBS */ 830/* CBSFindLargest -- find the largest block in the CBS */
831 831
832Bool CBSFindLargest(Range rangeReturn, Range oldRangeReturn, 832Bool CBSFindLargest(Range rangeReturn, Range oldRangeReturn,
833 CBS cbs, FindDelete findDelete) 833 CBS cbs, Size size, FindDelete findDelete)
834{ 834{
835 Bool found = FALSE; 835 Bool found = FALSE;
836 SplayNode root; 836 SplayNode root;
@@ -849,19 +849,21 @@ Bool CBSFindLargest(Range rangeReturn, Range oldRangeReturn,
849 RangeStruct range; 849 RangeStruct range;
850 CBSBlock block; 850 CBSBlock block;
851 SplayNode node = NULL; /* suppress "may be used uninitialized" */ 851 SplayNode node = NULL; /* suppress "may be used uninitialized" */
852 Size size; 852 Size maxSize;
853 853
854 size = cbsBlockOfSplayNode(root)->maxSize; 854 maxSize = cbsBlockOfSplayNode(root)->maxSize;
855 METER_ACC(cbs->splaySearch, cbs->splayTreeSize); 855 if (maxSize >= size) {
856 found = SplayFindFirst(&node, splayTreeOfCBS(cbs), &cbsTestNode, 856 METER_ACC(cbs->splaySearch, cbs->splayTreeSize);
857 &cbsTestTree, NULL, size); 857 found = SplayFindFirst(&node, splayTreeOfCBS(cbs), &cbsTestNode,
858 AVER(found); /* maxSize is exact, so we will find it. */ 858 &cbsTestTree, NULL, maxSize);
859 block = cbsBlockOfSplayNode(node); 859 AVER(found); /* maxSize is exact, so we will find it. */
860 AVER(CBSBlockSize(block) >= size); 860 block = cbsBlockOfSplayNode(node);
861 RangeInit(&range, CBSBlockBase(block), CBSBlockLimit(block)); 861 AVER(CBSBlockSize(block) >= maxSize);
862 AVER(RangeSize(&range) >= size); 862 RangeInit(&range, CBSBlockBase(block), CBSBlockLimit(block));
863 cbsFindDeleteRange(rangeReturn, oldRangeReturn, cbs, &range, 863 AVER(RangeSize(&range) >= maxSize);
864 size, findDelete); 864 cbsFindDeleteRange(rangeReturn, oldRangeReturn, cbs, &range,
865 maxSize, findDelete);
866 }
865 } 867 }
866 868
867 CBSLeave(cbs); 869 CBSLeave(cbs);
diff --git a/mps/code/cbs.h b/mps/code/cbs.h
index 5b651c1aaf8..aba66cf5c19 100644
--- a/mps/code/cbs.h
+++ b/mps/code/cbs.h
@@ -53,7 +53,7 @@ extern Bool CBSFindFirst(Range rangeReturn, Range oldRangeReturn,
53extern Bool CBSFindLast(Range rangeReturn, Range oldRangeReturn, 53extern Bool CBSFindLast(Range rangeReturn, Range oldRangeReturn,
54 CBS cbs, Size size, FindDelete findDelete); 54 CBS cbs, Size size, FindDelete findDelete);
55extern Bool CBSFindLargest(Range rangeReturn, Range oldRangeReturn, 55extern Bool CBSFindLargest(Range rangeReturn, Range oldRangeReturn,
56 CBS cbs, FindDelete findDelete); 56 CBS cbs, Size size, FindDelete findDelete);
57 57
58 58
59#endif /* cbs_h */ 59#endif /* cbs_h */