diff --git a/ConflictSet.cpp b/ConflictSet.cpp index 5d46c90..bbf7ea0 100644 --- a/ConflictSet.cpp +++ b/ConflictSet.cpp @@ -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) {