From 2df7000090551fb492a5d0ce2fd5aef99f1c3779 Mon Sep 17 00:00:00 2001 From: Andrew Noyes Date: Thu, 27 Jun 2024 20:51:35 -0700 Subject: [PATCH] Remove switch on phase from Stepwise left/right step --- ConflictSet.cpp | 274 ++++++++++++++++++++++-------------------------- 1 file changed, 124 insertions(+), 150 deletions(-) diff --git a/ConflictSet.cpp b/ConflictSet.cpp index cd51279..f84dc06 100644 --- a/ConflictSet.cpp +++ b/ConflictSet.cpp @@ -2001,37 +2001,63 @@ struct CheckRangeLeftSide { int searchPathLen = 0; bool ok; - enum Phase { Search, DownLeftSpine } phase = Search; - bool step() { - switch (phase) { - case Search: { - if (maxVersion(n, impl) <= readVersion) { - ok = true; + if (maxVersion(n, impl) <= readVersion) { + ok = true; + return true; + } + if (remaining.size() == 0) { + assert(searchPathLen >= prefixLen); + ok = maxVersion(n, impl) <= readVersion; + return true; + } + + if (searchPathLen >= prefixLen) { + if (!checkMaxBetweenExclusive(n, remaining[0], 256, readVersion)) { + ok = false; return true; } - if (remaining.size() == 0) { - assert(searchPathLen >= prefixLen); + } + + auto *child = getChild(n, remaining[0]); + if (child == nullptr) { + int c = getChildGeq(n, remaining[0]); + if (c >= 0) { + if (searchPathLen < prefixLen) { + n = getChildExists(n, c); + return downLeftSpine(); + } + n = getChildExists(n, c); ok = maxVersion(n, impl) <= readVersion; return true; - } - - if (searchPathLen >= prefixLen) { - if (!checkMaxBetweenExclusive(n, remaining[0], 256, readVersion)) { - ok = false; + } else { + n = nextSibling(n); + if (n == nullptr) { + ok = true; return true; } + return downLeftSpine(); } + } - auto *child = getChild(n, remaining[0]); - if (child == nullptr) { - int c = getChildGeq(n, remaining[0]); - if (c >= 0) { + n = child; + remaining = remaining.subspan(1, remaining.size() - 1); + ++searchPathLen; + + if (n->partialKeyLen > 0) { + int commonLen = std::min(n->partialKeyLen, remaining.size()); + int i = longestCommonPrefix(n->partialKey(), remaining.data(), commonLen); + searchPathLen += i; + if (i < commonLen) { + auto c = n->partialKey()[i] <=> remaining[i]; + if (c > 0) { if (searchPathLen < prefixLen) { - n = getChildExists(n, c); return downLeftSpine(); } - n = getChildExists(n, c); + if (n->entryPresent && n->entry.rangeVersion > readVersion) { + ok = false; + return true; + } ok = maxVersion(n, impl) <= readVersion; return true; } else { @@ -2043,54 +2069,24 @@ struct CheckRangeLeftSide { return downLeftSpine(); } } - - n = child; - remaining = remaining.subspan(1, remaining.size() - 1); - ++searchPathLen; - - if (n->partialKeyLen > 0) { - int commonLen = std::min(n->partialKeyLen, remaining.size()); - int i = - longestCommonPrefix(n->partialKey(), remaining.data(), commonLen); - searchPathLen += i; - if (i < commonLen) { - auto c = n->partialKey()[i] <=> remaining[i]; - if (c > 0) { - if (searchPathLen < prefixLen) { - return downLeftSpine(); - } - if (n->entryPresent && n->entry.rangeVersion > readVersion) { - ok = false; - return true; - } - ok = maxVersion(n, impl) <= readVersion; - return true; - } else { - n = nextSibling(n); - if (n == nullptr) { - ok = true; - return true; - } - return downLeftSpine(); - } - } - if (commonLen == n->partialKeyLen) { - // partial key matches - remaining = - remaining.subspan(commonLen, remaining.size() - commonLen); - } else if (n->partialKeyLen > int(remaining.size())) { - assert(searchPathLen >= prefixLen); - if (n->entryPresent && n->entry.rangeVersion > readVersion) { - ok = false; - return true; - } - ok = maxVersion(n, impl) <= readVersion; + if (commonLen == n->partialKeyLen) { + // partial key matches + remaining = remaining.subspan(commonLen, remaining.size() - commonLen); + } else if (n->partialKeyLen > int(remaining.size())) { + assert(searchPathLen >= prefixLen); + if (n->entryPresent && n->entry.rangeVersion > readVersion) { + ok = false; return true; } + ok = maxVersion(n, impl) <= readVersion; + return true; } - break; } - case DownLeftSpine: { + return false; + } + + bool downLeftSpine() { + for (;;) { if (n->entryPresent) { ok = n->entry.rangeVersion <= readVersion; return true; @@ -2098,16 +2094,7 @@ struct CheckRangeLeftSide { int c = getChildGeq(n, 0); assert(c >= 0); n = getChildExists(n, c); - } break; - default: // GCOVR_EXCL_LINE - __builtin_unreachable(); // GCOVR_EXCL_LINE } - return false; - } - - bool downLeftSpine() { - phase = DownLeftSpine; - return false; } }; @@ -2134,97 +2121,78 @@ struct CheckRangeRightSide { int searchPathLen = 0; bool ok; - enum Phase { Search, DownLeftSpine } phase = Search; - bool step() { - switch (phase) { - case Search: { #if DEBUG_VERBOSE && !defined(NDEBUG) - fprintf( - stderr, - "Search path: %s, searchPathLen: %d, prefixLen: %d, remaining: %s\n", - getSearchPathPrintable(n).c_str(), searchPathLen, prefixLen, - printable(remaining).c_str()); + fprintf(stderr, + "Search path: %s, searchPathLen: %d, prefixLen: %d, remaining: " + "%s\n", + getSearchPathPrintable(n).c_str(), searchPathLen, prefixLen, + printable(remaining).c_str()); #endif - assert(searchPathLen <= int(key.size())); + assert(searchPathLen <= int(key.size())); - if (remaining.size() == 0) { - return downLeftSpine(); - } + if (remaining.size() == 0) { + return downLeftSpine(); + } - if (searchPathLen >= prefixLen) { - if (n->entryPresent && n->entry.pointVersion > readVersion) { - ok = false; - return true; - } - - if (!checkMaxBetweenExclusive(n, -1, remaining[0], readVersion)) { - ok = false; - return true; - } - } - - if (searchPathLen > prefixLen && n->entryPresent && - n->entry.rangeVersion > readVersion) { + if (searchPathLen >= prefixLen) { + if (n->entryPresent && n->entry.pointVersion > readVersion) { ok = false; return true; } - auto *child = getChild(n, remaining[0]); - if (child == nullptr) { - int c = getChildGeq(n, remaining[0]); - if (c >= 0) { - n = getChildExists(n, c); + if (!checkMaxBetweenExclusive(n, -1, remaining[0], readVersion)) { + ok = false; + return true; + } + } + + if (searchPathLen > prefixLen && n->entryPresent && + n->entry.rangeVersion > readVersion) { + ok = false; + return true; + } + + auto *child = getChild(n, remaining[0]); + if (child == nullptr) { + int c = getChildGeq(n, remaining[0]); + if (c >= 0) { + n = getChildExists(n, c); + return downLeftSpine(); + } else { + return backtrack(); + } + } + + n = child; + remaining = remaining.subspan(1, remaining.size() - 1); + ++searchPathLen; + + if (n->partialKeyLen > 0) { + int commonLen = std::min(n->partialKeyLen, remaining.size()); + int i = longestCommonPrefix(n->partialKey(), remaining.data(), commonLen); + searchPathLen += i; + if (i < commonLen) { + ++searchPathLen; + auto c = n->partialKey()[i] <=> remaining[i]; + if (c > 0) { return downLeftSpine(); } else { + if (searchPathLen > prefixLen && n->entryPresent && + n->entry.rangeVersion > readVersion) { + ok = false; + return true; + } return backtrack(); } } - - n = child; - remaining = remaining.subspan(1, remaining.size() - 1); - ++searchPathLen; - - if (n->partialKeyLen > 0) { - int commonLen = std::min(n->partialKeyLen, remaining.size()); - int i = - longestCommonPrefix(n->partialKey(), remaining.data(), commonLen); - searchPathLen += i; - if (i < commonLen) { - ++searchPathLen; - auto c = n->partialKey()[i] <=> remaining[i]; - if (c > 0) { - return downLeftSpine(); - } else { - if (searchPathLen > prefixLen && n->entryPresent && - n->entry.rangeVersion > readVersion) { - ok = false; - return true; - } - return backtrack(); - } - } - if (commonLen == n->partialKeyLen) { - // partial key matches - remaining = - remaining.subspan(commonLen, remaining.size() - commonLen); - } else if (n->partialKeyLen > int(remaining.size())) { - return downLeftSpine(); - } + if (commonLen == n->partialKeyLen) { + // partial key matches + remaining = remaining.subspan(commonLen, remaining.size() - commonLen); + } else if (n->partialKeyLen > int(remaining.size())) { + return downLeftSpine(); } - } break; - case DownLeftSpine: { - if (n->entryPresent) { - ok = n->entry.rangeVersion <= readVersion; - return true; - } - int c = getChildGeq(n, 0); - assert(c >= 0); - n = getChildExists(n, c); - } break; - default: // GCOVR_EXCL_LINE - __builtin_unreachable(); // GCOVR_EXCL_LINE } return false; } @@ -2253,9 +2221,15 @@ struct CheckRangeRightSide { } bool downLeftSpine() { - phase = DownLeftSpine; - assert(n != nullptr); - return false; + for (;;) { + if (n->entryPresent) { + ok = n->entry.rangeVersion <= readVersion; + return true; + } + int c = getChildGeq(n, 0); + assert(c >= 0); + n = getChildExists(n, c); + } } };