Remove some usages of generic getFirstChild

This commit is contained in:
2024-11-20 21:43:47 -08:00
parent 7c01f8ba0f
commit 90fb2a9542

View File

@@ -1379,6 +1379,12 @@ TaggedNodePointer getFirstChild(Node *self) {
// GCOVR_EXCL_STOP // 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 // self must not be the root
void maybeDecreaseCapacity(Node *&self, WriteContext *writeContext, void maybeDecreaseCapacity(Node *&self, WriteContext *writeContext,
ConflictSet::Impl *impl); ConflictSet::Impl *impl);
@@ -2676,13 +2682,13 @@ bool checkRangeStartsWith(NodeT *nTyped, TrivialSpan key, int begin, int end,
auto c = getChildGeq(nTyped, remaining[0]); auto c = getChildGeq(nTyped, remaining[0]);
if (c != nullptr) { if (c != nullptr) {
n = c; n = c;
goto downLeftSpine; return checkRangeVersionOfFirstGeq(n, readVersion);
} else { } else {
n = nextSibling(nTyped); n = nextSibling(nTyped);
if (n == nullptr) { if (n == nullptr) {
return true; 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) { if (i < commonLen) {
auto c = n->partialKey()[i] <=> remaining[i]; auto c = n->partialKey()[i] <=> remaining[i];
if (c > 0) { if (c > 0) {
goto downLeftSpine; return checkRangeVersionOfFirstGeq(n, readVersion);
} else { } else {
n = nextSibling(n); n = nextSibling(n);
if (n == nullptr) { if (n == nullptr) {
return true; return true;
} }
goto downLeftSpine; return checkRangeVersionOfFirstGeq(n, readVersion);
} }
} }
assert(n->partialKeyLen > remaining.size()); assert(n->partialKeyLen > remaining.size());
@@ -2717,11 +2723,6 @@ bool checkRangeStartsWith(NodeT *nTyped, TrivialSpan key, int begin, int end,
} }
__builtin_unreachable(); // GCOVR_EXCL_LINE __builtin_unreachable(); // GCOVR_EXCL_LINE
downLeftSpine:
for (; !n->entryPresent; n = getFirstChild(n)) {
}
return n->entry.rangeVersion <= readVersion;
} }
#ifdef __x86_64__ #ifdef __x86_64__
@@ -4434,7 +4435,7 @@ bool checkPointRead(Node *n, const TrivialSpan key,
return n->entry.pointVersion <= readVersion; return n->entry.pointVersion <= readVersion;
} }
n = getFirstChild(n); n = getFirstChild(n);
goto downLeftSpine; return checkRangeVersionOfFirstGeq(n, readVersion);
} }
auto [c, maxV] = getChildAndMaxVersion(n, remaining[0]); auto [c, maxV] = getChildAndMaxVersion(n, remaining[0]);
@@ -4443,13 +4444,13 @@ bool checkPointRead(Node *n, const TrivialSpan key,
auto c = getChildGeq(n, remaining[0]); auto c = getChildGeq(n, remaining[0]);
if (c != nullptr) { if (c != nullptr) {
n = c; n = c;
goto downLeftSpine; return checkRangeVersionOfFirstGeq(n, readVersion);
} else { } else {
n = nextSibling(n); n = nextSibling(n);
if (n == nullptr) { if (n == nullptr) {
return true; return true;
} }
goto downLeftSpine; return checkRangeVersionOfFirstGeq(n, readVersion);
} }
} }
@@ -4462,13 +4463,13 @@ bool checkPointRead(Node *n, const TrivialSpan key,
if (i < commonLen) { if (i < commonLen) {
auto c = n->partialKey()[i] <=> remaining[i]; auto c = n->partialKey()[i] <=> remaining[i];
if (c > 0) { if (c > 0) {
goto downLeftSpine; return checkRangeVersionOfFirstGeq(n, readVersion);
} else { } else {
n = nextSibling(n); n = nextSibling(n);
if (n == nullptr) { if (n == nullptr) {
return true; return true;
} }
goto downLeftSpine; return checkRangeVersionOfFirstGeq(n, readVersion);
} }
} }
if (commonLen == n->partialKeyLen) { if (commonLen == n->partialKeyLen) {
@@ -4477,7 +4478,7 @@ bool checkPointRead(Node *n, const TrivialSpan key,
} else if (n->partialKeyLen > remaining.size()) { } else if (n->partialKeyLen > remaining.size()) {
// n is the first physical node greater than remaining, and there's no // n is the first physical node greater than remaining, and there's no
// eq node // eq node
goto downLeftSpine; return checkRangeVersionOfFirstGeq(n, readVersion);
} }
} }
@@ -4486,10 +4487,6 @@ bool checkPointRead(Node *n, const TrivialSpan key,
return true; 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 // 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]); auto c = getChildGeq(n, remaining[0]);
if (c != nullptr) { if (c != nullptr) {
n = c; n = c;
goto downLeftSpine; return checkRangeVersionOfFirstGeq(n, readVersion);
} else { } else {
n = nextSibling(n); n = nextSibling(n);
if (n == nullptr) { if (n == nullptr) {
return true; return true;
} }
goto downLeftSpine; return checkRangeVersionOfFirstGeq(n, readVersion);
} }
} }
@@ -4533,13 +4530,13 @@ bool checkPrefixRead(Node *n, const TrivialSpan key,
if (i < commonLen) { if (i < commonLen) {
auto c = n->partialKey()[i] <=> remaining[i]; auto c = n->partialKey()[i] <=> remaining[i];
if (c > 0) { if (c > 0) {
goto downLeftSpine; return checkRangeVersionOfFirstGeq(n, readVersion);
} else { } else {
n = nextSibling(n); n = nextSibling(n);
if (n == nullptr) { if (n == nullptr) {
return true; return true;
} }
goto downLeftSpine; return checkRangeVersionOfFirstGeq(n, readVersion);
} }
} }
if (commonLen == n->partialKeyLen) { if (commonLen == n->partialKeyLen) {
@@ -4552,7 +4549,7 @@ bool checkPrefixRead(Node *n, const TrivialSpan key,
if (maxV > readVersion) { if (maxV > readVersion) {
return false; return false;
} }
goto downLeftSpine; return checkRangeVersionOfFirstGeq(n, readVersion);
} }
} }
@@ -4561,10 +4558,6 @@ bool checkPrefixRead(Node *n, const TrivialSpan key,
return true; 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] // 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 (c != nullptr) {
if (searchPathLen < prefixLen) { if (searchPathLen < prefixLen) {
n = c; n = c;
goto downLeftSpine; return checkRangeVersionOfFirstGeq(n, readVersion);
} }
n = c; n = c;
return maxVersion(n) <= readVersion; return maxVersion(n) <= readVersion;
@@ -4603,7 +4596,7 @@ bool checkRangeLeftSide(Node *n, TrivialSpan key, int prefixLen,
if (n == nullptr) { if (n == nullptr) {
return true; 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]; auto c = n->partialKey()[i] <=> remaining[i];
if (c > 0) { if (c > 0) {
if (searchPathLen < prefixLen) { if (searchPathLen < prefixLen) {
goto downLeftSpine; return checkRangeVersionOfFirstGeq(n, readVersion);
} }
if (n->entryPresent && n->entry.rangeVersion > readVersion) { if (n->entryPresent && n->entry.rangeVersion > readVersion) {
return false; return false;
@@ -4630,7 +4623,7 @@ bool checkRangeLeftSide(Node *n, TrivialSpan key, int prefixLen,
if (n == nullptr) { if (n == nullptr) {
return true; return true;
} }
goto downLeftSpine; return checkRangeVersionOfFirstGeq(n, readVersion);
} }
} }
if (commonLen == n->partialKeyLen) { if (commonLen == n->partialKeyLen) {
@@ -4648,10 +4641,6 @@ bool checkRangeLeftSide(Node *n, TrivialSpan key, int prefixLen,
return true; 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] // 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) { for (;; ++readContext->range_read_iterations_accum) {
assert(searchPathLen <= key.size()); assert(searchPathLen <= key.size());
if (remaining.size() == 0) { if (remaining.size() == 0) {
goto downLeftSpine; return checkRangeVersionOfFirstGeq(n, readVersion);
} }
if (searchPathLen >= prefixLen) { if (searchPathLen >= prefixLen) {
@@ -4689,7 +4678,7 @@ bool checkRangeRightSide(Node *n, TrivialSpan key, int prefixLen,
auto c = getChildGeq(n, remaining[0]); auto c = getChildGeq(n, remaining[0]);
if (c != nullptr) { if (c != nullptr) {
n = c; n = c;
goto downLeftSpine; return checkRangeVersionOfFirstGeq(n, readVersion);
} else { } else {
goto backtrack; goto backtrack;
} }
@@ -4707,7 +4696,7 @@ bool checkRangeRightSide(Node *n, TrivialSpan key, int prefixLen,
++searchPathLen; ++searchPathLen;
auto c = n->partialKey()[i] <=> remaining[i]; auto c = n->partialKey()[i] <=> remaining[i];
if (c > 0) { if (c > 0) {
goto downLeftSpine; return checkRangeVersionOfFirstGeq(n, readVersion);
} else { } else {
if (searchPathLen > prefixLen && n->entryPresent && if (searchPathLen > prefixLen && n->entryPresent &&
n->entry.rangeVersion > readVersion) { n->entry.rangeVersion > readVersion) {
@@ -4720,7 +4709,7 @@ bool checkRangeRightSide(Node *n, TrivialSpan key, int prefixLen,
// partial key matches // partial key matches
remaining = remaining.subspan(commonLen, remaining.size() - commonLen); remaining = remaining.subspan(commonLen, remaining.size() - commonLen);
} else if (n->partialKeyLen > remaining.size()) { } else if (n->partialKeyLen > remaining.size()) {
goto downLeftSpine; return checkRangeVersionOfFirstGeq(n, readVersion);
} }
} }
} }
@@ -4739,13 +4728,9 @@ backtrack:
n = n->parent; n = n->parent;
} else { } else {
n = next; 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, bool checkRangeRead(Node *n, TrivialSpan begin, TrivialSpan end,
InternalVersionT readVersion, ReadContext *readContext) { InternalVersionT readVersion, ReadContext *readContext) {