Remove some usages of generic getFirstChild
This commit is contained in:
@@ -1379,6 +1379,12 @@ TaggedNodePointer getFirstChild(Node *self) {
|
||||
// GCOVR_EXCL_STOP
|
||||
}
|
||||
|
||||
bool checkRangeVersionOfFirstGeq(Node *node, InternalVersionT readVersion) {
|
||||
for (; !node->entryPresent; node = getFirstChild(node)) {
|
||||
}
|
||||
return node->entry.rangeVersion <= readVersion;
|
||||
}
|
||||
|
||||
// self must not be the root
|
||||
void maybeDecreaseCapacity(Node *&self, WriteContext *writeContext,
|
||||
ConflictSet::Impl *impl);
|
||||
@@ -2676,13 +2682,13 @@ bool checkRangeStartsWith(NodeT *nTyped, TrivialSpan key, int begin, int end,
|
||||
auto c = getChildGeq(nTyped, remaining[0]);
|
||||
if (c != nullptr) {
|
||||
n = c;
|
||||
goto downLeftSpine;
|
||||
return checkRangeVersionOfFirstGeq(n, readVersion);
|
||||
} else {
|
||||
n = nextSibling(nTyped);
|
||||
if (n == nullptr) {
|
||||
return true;
|
||||
}
|
||||
goto downLeftSpine;
|
||||
return checkRangeVersionOfFirstGeq(n, readVersion);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2696,13 +2702,13 @@ bool checkRangeStartsWith(NodeT *nTyped, TrivialSpan key, int begin, int end,
|
||||
if (i < commonLen) {
|
||||
auto c = n->partialKey()[i] <=> remaining[i];
|
||||
if (c > 0) {
|
||||
goto downLeftSpine;
|
||||
return checkRangeVersionOfFirstGeq(n, readVersion);
|
||||
} else {
|
||||
n = nextSibling(n);
|
||||
if (n == nullptr) {
|
||||
return true;
|
||||
}
|
||||
goto downLeftSpine;
|
||||
return checkRangeVersionOfFirstGeq(n, readVersion);
|
||||
}
|
||||
}
|
||||
assert(n->partialKeyLen > remaining.size());
|
||||
@@ -2717,11 +2723,6 @@ bool checkRangeStartsWith(NodeT *nTyped, TrivialSpan key, int begin, int end,
|
||||
}
|
||||
|
||||
__builtin_unreachable(); // GCOVR_EXCL_LINE
|
||||
|
||||
downLeftSpine:
|
||||
for (; !n->entryPresent; n = getFirstChild(n)) {
|
||||
}
|
||||
return n->entry.rangeVersion <= readVersion;
|
||||
}
|
||||
|
||||
#ifdef __x86_64__
|
||||
@@ -4434,7 +4435,7 @@ bool checkPointRead(Node *n, const TrivialSpan key,
|
||||
return n->entry.pointVersion <= readVersion;
|
||||
}
|
||||
n = getFirstChild(n);
|
||||
goto downLeftSpine;
|
||||
return checkRangeVersionOfFirstGeq(n, readVersion);
|
||||
}
|
||||
|
||||
auto [c, maxV] = getChildAndMaxVersion(n, remaining[0]);
|
||||
@@ -4443,13 +4444,13 @@ bool checkPointRead(Node *n, const TrivialSpan key,
|
||||
auto c = getChildGeq(n, remaining[0]);
|
||||
if (c != nullptr) {
|
||||
n = c;
|
||||
goto downLeftSpine;
|
||||
return checkRangeVersionOfFirstGeq(n, readVersion);
|
||||
} else {
|
||||
n = nextSibling(n);
|
||||
if (n == nullptr) {
|
||||
return true;
|
||||
}
|
||||
goto downLeftSpine;
|
||||
return checkRangeVersionOfFirstGeq(n, readVersion);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4462,13 +4463,13 @@ bool checkPointRead(Node *n, const TrivialSpan key,
|
||||
if (i < commonLen) {
|
||||
auto c = n->partialKey()[i] <=> remaining[i];
|
||||
if (c > 0) {
|
||||
goto downLeftSpine;
|
||||
return checkRangeVersionOfFirstGeq(n, readVersion);
|
||||
} else {
|
||||
n = nextSibling(n);
|
||||
if (n == nullptr) {
|
||||
return true;
|
||||
}
|
||||
goto downLeftSpine;
|
||||
return checkRangeVersionOfFirstGeq(n, readVersion);
|
||||
}
|
||||
}
|
||||
if (commonLen == n->partialKeyLen) {
|
||||
@@ -4477,7 +4478,7 @@ bool checkPointRead(Node *n, const TrivialSpan key,
|
||||
} else if (n->partialKeyLen > remaining.size()) {
|
||||
// n is the first physical node greater than remaining, and there's no
|
||||
// eq node
|
||||
goto downLeftSpine;
|
||||
return checkRangeVersionOfFirstGeq(n, readVersion);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4486,10 +4487,6 @@ bool checkPointRead(Node *n, const TrivialSpan key,
|
||||
return true;
|
||||
}
|
||||
}
|
||||
downLeftSpine:
|
||||
for (; !n->entryPresent; n = getFirstChild(n)) {
|
||||
}
|
||||
return n->entry.rangeVersion <= readVersion;
|
||||
}
|
||||
|
||||
// Logically this is the same as performing firstGeq and then checking against
|
||||
@@ -4514,13 +4511,13 @@ bool checkPrefixRead(Node *n, const TrivialSpan key,
|
||||
auto c = getChildGeq(n, remaining[0]);
|
||||
if (c != nullptr) {
|
||||
n = c;
|
||||
goto downLeftSpine;
|
||||
return checkRangeVersionOfFirstGeq(n, readVersion);
|
||||
} else {
|
||||
n = nextSibling(n);
|
||||
if (n == nullptr) {
|
||||
return true;
|
||||
}
|
||||
goto downLeftSpine;
|
||||
return checkRangeVersionOfFirstGeq(n, readVersion);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4533,13 +4530,13 @@ bool checkPrefixRead(Node *n, const TrivialSpan key,
|
||||
if (i < commonLen) {
|
||||
auto c = n->partialKey()[i] <=> remaining[i];
|
||||
if (c > 0) {
|
||||
goto downLeftSpine;
|
||||
return checkRangeVersionOfFirstGeq(n, readVersion);
|
||||
} else {
|
||||
n = nextSibling(n);
|
||||
if (n == nullptr) {
|
||||
return true;
|
||||
}
|
||||
goto downLeftSpine;
|
||||
return checkRangeVersionOfFirstGeq(n, readVersion);
|
||||
}
|
||||
}
|
||||
if (commonLen == n->partialKeyLen) {
|
||||
@@ -4552,7 +4549,7 @@ bool checkPrefixRead(Node *n, const TrivialSpan key,
|
||||
if (maxV > readVersion) {
|
||||
return false;
|
||||
}
|
||||
goto downLeftSpine;
|
||||
return checkRangeVersionOfFirstGeq(n, readVersion);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4561,10 +4558,6 @@ bool checkPrefixRead(Node *n, const TrivialSpan key,
|
||||
return true;
|
||||
}
|
||||
}
|
||||
downLeftSpine:
|
||||
for (; !n->entryPresent; n = getFirstChild(n)) {
|
||||
}
|
||||
return n->entry.rangeVersion <= readVersion;
|
||||
}
|
||||
|
||||
// Return true if the max version among all keys that start with key[:prefixLen]
|
||||
@@ -4594,7 +4587,7 @@ bool checkRangeLeftSide(Node *n, TrivialSpan key, int prefixLen,
|
||||
if (c != nullptr) {
|
||||
if (searchPathLen < prefixLen) {
|
||||
n = c;
|
||||
goto downLeftSpine;
|
||||
return checkRangeVersionOfFirstGeq(n, readVersion);
|
||||
}
|
||||
n = c;
|
||||
return maxVersion(n) <= readVersion;
|
||||
@@ -4603,7 +4596,7 @@ bool checkRangeLeftSide(Node *n, TrivialSpan key, int prefixLen,
|
||||
if (n == nullptr) {
|
||||
return true;
|
||||
}
|
||||
goto downLeftSpine;
|
||||
return checkRangeVersionOfFirstGeq(n, readVersion);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4619,7 +4612,7 @@ bool checkRangeLeftSide(Node *n, TrivialSpan key, int prefixLen,
|
||||
auto c = n->partialKey()[i] <=> remaining[i];
|
||||
if (c > 0) {
|
||||
if (searchPathLen < prefixLen) {
|
||||
goto downLeftSpine;
|
||||
return checkRangeVersionOfFirstGeq(n, readVersion);
|
||||
}
|
||||
if (n->entryPresent && n->entry.rangeVersion > readVersion) {
|
||||
return false;
|
||||
@@ -4630,7 +4623,7 @@ bool checkRangeLeftSide(Node *n, TrivialSpan key, int prefixLen,
|
||||
if (n == nullptr) {
|
||||
return true;
|
||||
}
|
||||
goto downLeftSpine;
|
||||
return checkRangeVersionOfFirstGeq(n, readVersion);
|
||||
}
|
||||
}
|
||||
if (commonLen == n->partialKeyLen) {
|
||||
@@ -4648,10 +4641,6 @@ bool checkRangeLeftSide(Node *n, TrivialSpan key, int prefixLen,
|
||||
return true;
|
||||
}
|
||||
}
|
||||
downLeftSpine:
|
||||
for (; !n->entryPresent; n = getFirstChild(n)) {
|
||||
}
|
||||
return n->entry.rangeVersion <= readVersion;
|
||||
}
|
||||
|
||||
// Return true if the max version among all keys that start with key[:prefixLen]
|
||||
@@ -4665,7 +4654,7 @@ bool checkRangeRightSide(Node *n, TrivialSpan key, int prefixLen,
|
||||
for (;; ++readContext->range_read_iterations_accum) {
|
||||
assert(searchPathLen <= key.size());
|
||||
if (remaining.size() == 0) {
|
||||
goto downLeftSpine;
|
||||
return checkRangeVersionOfFirstGeq(n, readVersion);
|
||||
}
|
||||
|
||||
if (searchPathLen >= prefixLen) {
|
||||
@@ -4689,7 +4678,7 @@ bool checkRangeRightSide(Node *n, TrivialSpan key, int prefixLen,
|
||||
auto c = getChildGeq(n, remaining[0]);
|
||||
if (c != nullptr) {
|
||||
n = c;
|
||||
goto downLeftSpine;
|
||||
return checkRangeVersionOfFirstGeq(n, readVersion);
|
||||
} else {
|
||||
goto backtrack;
|
||||
}
|
||||
@@ -4707,7 +4696,7 @@ bool checkRangeRightSide(Node *n, TrivialSpan key, int prefixLen,
|
||||
++searchPathLen;
|
||||
auto c = n->partialKey()[i] <=> remaining[i];
|
||||
if (c > 0) {
|
||||
goto downLeftSpine;
|
||||
return checkRangeVersionOfFirstGeq(n, readVersion);
|
||||
} else {
|
||||
if (searchPathLen > prefixLen && n->entryPresent &&
|
||||
n->entry.rangeVersion > readVersion) {
|
||||
@@ -4720,7 +4709,7 @@ bool checkRangeRightSide(Node *n, TrivialSpan key, int prefixLen,
|
||||
// partial key matches
|
||||
remaining = remaining.subspan(commonLen, remaining.size() - commonLen);
|
||||
} else if (n->partialKeyLen > remaining.size()) {
|
||||
goto downLeftSpine;
|
||||
return checkRangeVersionOfFirstGeq(n, readVersion);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4739,13 +4728,9 @@ backtrack:
|
||||
n = n->parent;
|
||||
} else {
|
||||
n = next;
|
||||
goto downLeftSpine;
|
||||
return checkRangeVersionOfFirstGeq(n, readVersion);
|
||||
}
|
||||
}
|
||||
downLeftSpine:
|
||||
for (; !n->entryPresent; n = getFirstChild(n)) {
|
||||
}
|
||||
return n->entry.rangeVersion <= readVersion;
|
||||
}
|
||||
bool checkRangeRead(Node *n, TrivialSpan begin, TrivialSpan end,
|
||||
InternalVersionT readVersion, ReadContext *readContext) {
|
||||
|
Reference in New Issue
Block a user