From 958ee15cfcf008265130b1cc7af533e2d1981e4e Mon Sep 17 00:00:00 2001 From: Andrew Noyes Date: Tue, 29 Oct 2024 20:43:58 -0700 Subject: [PATCH] Use forwarding pointers instead of beginIsPrefix --- ConflictSet.cpp | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/ConflictSet.cpp b/ConflictSet.cpp index 610de73..203cfc3 100644 --- a/ConflictSet.cpp +++ b/ConflictSet.cpp @@ -3108,10 +3108,15 @@ void fixupMaxVersion(Node *node, WriteContext *writeContext) { setMaxVersion(node, max); } -void addWriteRange(TaggedNodePointer &beginRoot, std::span begin, - TaggedNodePointer &endRoot, std::span end, - InternalVersionT writeVersion, WriteContext *writeContext, - ConflictSet::Impl *impl, bool beginIsPrefix) { +struct AddedWriteRange { + Node *beginNode; + Node *endNode; +}; + +AddedWriteRange +addWriteRange(TaggedNodePointer &beginRoot, std::span begin, + TaggedNodePointer &endRoot, std::span end, + InternalVersionT writeVersion, WriteContext *writeContext) { ++writeContext->accum.range_writes; Node *beginNode = *insert(&beginRoot, begin, writeVersion, writeContext); @@ -3134,15 +3139,18 @@ void addWriteRange(TaggedNodePointer &beginRoot, std::span begin, endNode->entry.pointVersion = p == nullptr ? writeContext->zero : std::max(p->entry.rangeVersion, writeContext->zero); - if (beginIsPrefix) { - // beginNode may have been invalidated when inserting end - beginNode = beginRoot; - assert(beginNode->entryPresent); + while (beginNode->releaseDeferred) { + beginNode = beginNode->forwardTo; } endNode->entryPresent = true; } endNode->entry.rangeVersion = writeVersion; + return {beginNode, endNode}; +} + +void eraseInRange(Node *beginNode, Node *endNode, WriteContext *writeContext, + ConflictSet::Impl *impl) { // Erase nodes in range assert(!beginNode->endOfRange); assert(!endNode->endOfRange); @@ -3172,9 +3180,11 @@ void addWriteRange(TaggedNodePointer &root, std::span begin, auto useAsRoot = insert(&root, begin.subspan(0, lcp), writeVersion, writeContext); - addWriteRange(*useAsRoot, begin.subspan(lcp, begin.size() - lcp), *useAsRoot, - end.subspan(lcp, end.size() - lcp), writeVersion, writeContext, - impl, int(begin.size()) == lcp); + auto [beginNode, endNode] = addWriteRange( + *useAsRoot, begin.subspan(lcp, begin.size() - lcp), *useAsRoot, + end.subspan(lcp, end.size() - lcp), writeVersion, writeContext); + + eraseInRange(beginNode, endNode, writeContext, impl); } Node *firstGeqPhysical(Node *n, const std::span key) {