diff options
| author | Gareth Rees | 2013-06-03 16:16:04 +0100 |
|---|---|---|
| committer | Gareth Rees | 2013-06-03 16:16:04 +0100 |
| commit | ca36e1a1479304525892ff81622a6931b678abe2 (patch) | |
| tree | 50b456cf4f90c67a1886276ca5bf82baa6606bce /mps/code | |
| parent | be868669e31773ce7082ee4f2a6758d78aed8d59 (diff) | |
| download | emacs-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.c | 32 | ||||
| -rw-r--r-- | mps/code/cbs.h | 2 |
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 | ||
| 576 | failAlloc: | 576 | failAlloc: |
| @@ -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 | ||
| 832 | Bool CBSFindLargest(Range rangeReturn, Range oldRangeReturn, | 832 | Bool 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, | |||
| 53 | extern Bool CBSFindLast(Range rangeReturn, Range oldRangeReturn, | 53 | extern Bool CBSFindLast(Range rangeReturn, Range oldRangeReturn, |
| 54 | CBS cbs, Size size, FindDelete findDelete); | 54 | CBS cbs, Size size, FindDelete findDelete); |
| 55 | extern Bool CBSFindLargest(Range rangeReturn, Range oldRangeReturn, | 55 | extern 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 */ |