Remove some usages of generic getFirstChild
This commit is contained in:
@@ -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) {
|
||||||
|
Reference in New Issue
Block a user