From 68bbacb69a0aa4849dd88b670584e89693f21b3b Mon Sep 17 00:00:00 2001 From: Andrew Noyes Date: Tue, 13 Aug 2024 17:39:25 -0700 Subject: [PATCH] Use getInTree in eraseBetween --- ConflictSet.cpp | 49 +++++++++++++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/ConflictSet.cpp b/ConflictSet.cpp index 176d021..f8c2d06 100644 --- a/ConflictSet.cpp +++ b/ConflictSet.cpp @@ -1762,7 +1762,8 @@ void destroyTree(Node *root, WriteContext::Accum *accum) { } } -void eraseBetween(Node3 *&n, int begin, int end, WriteContext *tls) { +void eraseBetween(Node3 *n, int begin, int end, WriteContext *tls, + ConflictSet::Impl *impl) { const unsigned shiftUpperBound = end - begin; const unsigned shiftAmount = begin; auto inBounds = [&](unsigned c) { return c - shiftAmount < shiftUpperBound; }; @@ -1783,12 +1784,13 @@ void eraseBetween(Node3 *&n, int begin, int end, WriteContext *tls) { if (n->numChildren == 0) { auto *newNode = tls->allocate(n->partialKeyLen); newNode->copyChildrenAndKeyFrom(*n); + getInTree(n, impl) = newNode; tls->release(n); - (Node *&)n = newNode; } } -void eraseBetween(Node16 *&n, int begin, int end, WriteContext *tls) { +void eraseBetween(Node16 *n, int begin, int end, WriteContext *tls, + ConflictSet::Impl *impl) { const unsigned shiftUpperBound = end - begin; const unsigned shiftAmount = begin; auto inBounds = [&](unsigned c) { return c - shiftAmount < shiftUpperBound; }; @@ -1809,17 +1811,18 @@ void eraseBetween(Node16 *&n, int begin, int end, WriteContext *tls) { if (n->numChildren == 0) { auto *newNode = tls->allocate(n->partialKeyLen); newNode->copyChildrenAndKeyFrom(*n); + getInTree(n, impl) = newNode; tls->release(n); - (Node *&)n = newNode; } else if (n->numChildren <= Node3::kMaxNodes) { auto *newNode = tls->allocate(n->partialKeyLen); newNode->copyChildrenAndKeyFrom(*n); + getInTree(n, impl) = newNode; tls->release(n); - (Node *&)n = newNode; } } -void eraseBetween(Node48 *&n, int begin, int end, WriteContext *tls) { +void eraseBetween(Node48 *n, int begin, int end, WriteContext *tls, + ConflictSet::Impl *impl) { const unsigned shiftUpperBound = end - begin; const unsigned shiftAmount = begin; auto inBounds = [&](unsigned c) { return c - shiftAmount < shiftUpperBound; }; @@ -1850,22 +1853,23 @@ void eraseBetween(Node48 *&n, int begin, int end, WriteContext *tls) { if (n->numChildren == 0) { auto *newNode = tls->allocate(n->partialKeyLen); newNode->copyChildrenAndKeyFrom(*n); + getInTree(n, impl) = newNode; tls->release(n); - (Node *&)n = newNode; } else if (n->numChildren <= Node3::kMaxNodes) { auto *newNode = tls->allocate(n->partialKeyLen); newNode->copyChildrenAndKeyFrom(*n); + getInTree(n, impl) = newNode; tls->release(n); - (Node *&)n = newNode; } else if (n->numChildren <= Node16::kMaxNodes) { auto *newNode = tls->allocate(n->partialKeyLen); newNode->copyChildrenAndKeyFrom(*n); + getInTree(n, impl) = newNode; tls->release(n); - (Node *&)n = newNode; } } -void eraseBetween(Node256 *&n, int begin, int end, WriteContext *tls) { +void eraseBetween(Node256 *n, int begin, int end, WriteContext *tls, + ConflictSet::Impl *impl) { const unsigned shiftUpperBound = end - begin; const unsigned shiftAmount = begin; auto inBounds = [&](unsigned c) { return c - shiftAmount < shiftUpperBound; }; @@ -1884,43 +1888,48 @@ void eraseBetween(Node256 *&n, int begin, int end, WriteContext *tls) { if (n->numChildren == 0) { auto *newNode = tls->allocate(n->partialKeyLen); newNode->copyChildrenAndKeyFrom(*n); + getInTree(n, impl) = newNode; tls->release(n); - (Node *&)n = newNode; } else if (n->numChildren <= Node3::kMaxNodes) { auto *newNode = tls->allocate(n->partialKeyLen); newNode->copyChildrenAndKeyFrom(*n); + getInTree(n, impl) = newNode; tls->release(n); - (Node *&)n = newNode; } else if (n->numChildren <= Node16::kMaxNodes) { auto *newNode = tls->allocate(n->partialKeyLen); newNode->copyChildrenAndKeyFrom(*n); + getInTree(n, impl) = newNode; tls->release(n); - (Node *&)n = newNode; } else if (n->numChildren <= Node48::kMaxNodes) { auto *newNode = tls->allocate(n->partialKeyLen); newNode->copyChildrenAndKeyFrom(*n); + getInTree(n, impl) = newNode; tls->release(n); - (Node *&)n = newNode; } } // Erase all nodes with a search path starting with n + [child], // where child in [begin, end). -void eraseBetween(Node *&n, int begin, int end, WriteContext *tls) { +void eraseBetween(Node *n, int begin, int end, WriteContext *tls, + ConflictSet::Impl *impl) { +#if DEBUG_VERBOSE && !defined(NDEBUG) + fprintf(stderr, "eraseBetween: %s + [%d,%d)\n", + getSearchPathPrintable(n).c_str(), begin, end); +#endif switch (n->getType()) { case Type_Node0: break; case Type_Node3: - eraseBetween((Node3 *&)n, begin, end, tls); + eraseBetween((Node3 *)n, begin, end, tls, impl); break; case Type_Node16: - eraseBetween((Node16 *&)n, begin, end, tls); + eraseBetween((Node16 *)n, begin, end, tls, impl); break; case Type_Node48: - eraseBetween((Node48 *&)n, begin, end, tls); + eraseBetween((Node48 *)n, begin, end, tls, impl); break; case Type_Node256: - eraseBetween((Node256 *&)n, begin, end, tls); + eraseBetween((Node256 *)n, begin, end, tls, impl); break; default: // GCOVR_EXCL_LINE __builtin_unreachable(); // GCOVR_EXCL_LINE @@ -3209,7 +3218,7 @@ void addPrefixWrite(Node *&root, std::span begin, } endNode->entry.rangeVersion = writeVersion; - eraseBetween(getInTree(beginNode, impl), 0, 256, tls); + eraseBetween(beginNode, 0, 256, tls, impl); // Inserting end trashed endNode's maxVersion. Fix that fixupMaxVersion(endNode, impl, tls);