From 9015b555de9ddd1045990c4034c848794b61cf01 Mon Sep 17 00:00:00 2001 From: Andrew Noyes Date: Tue, 29 Oct 2024 17:24:10 -0700 Subject: [PATCH] Allow passing two roots to addWriteRange --- ConflictSet.cpp | 44 ++++++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/ConflictSet.cpp b/ConflictSet.cpp index ab79da1..610de73 100644 --- a/ConflictSet.cpp +++ b/ConflictSet.cpp @@ -3108,26 +3108,13 @@ void fixupMaxVersion(Node *node, WriteContext *writeContext) { setMaxVersion(node, max); } -void addWriteRange(TaggedNodePointer &root, std::span begin, - std::span end, InternalVersionT writeVersion, - WriteContext *writeContext, ConflictSet::Impl *impl) { - - int lcp = longestCommonPrefix(begin.data(), end.data(), - std::min(begin.size(), end.size())); - if (lcp == int(begin.size()) && end.size() == begin.size() + 1 && - end.back() == 0) { - return addPointWrite(root, begin, writeVersion, writeContext); - } +void addWriteRange(TaggedNodePointer &beginRoot, std::span begin, + TaggedNodePointer &endRoot, std::span end, + InternalVersionT writeVersion, WriteContext *writeContext, + ConflictSet::Impl *impl, bool beginIsPrefix) { ++writeContext->accum.range_writes; - const bool beginIsPrefix = lcp == int(begin.size()); - auto useAsRoot = - insert(&root, begin.subspan(0, lcp), writeVersion, writeContext); - - begin = begin.subspan(lcp, begin.size() - lcp); - end = end.subspan(lcp, end.size() - lcp); - - Node *beginNode = *insert(useAsRoot, begin, writeVersion, writeContext); + Node *beginNode = *insert(&beginRoot, begin, writeVersion, writeContext); addKey(beginNode); if (!beginNode->entryPresent) { ++writeContext->accum.entries_inserted; @@ -3139,7 +3126,7 @@ void addWriteRange(TaggedNodePointer &root, std::span begin, } beginNode->entry.pointVersion = writeVersion; - Node *endNode = *insert(useAsRoot, end, writeVersion, writeContext); + Node *endNode = *insert(&endRoot, end, writeVersion, writeContext); addKey(endNode); if (!endNode->entryPresent) { ++writeContext->accum.entries_inserted; @@ -3149,7 +3136,7 @@ void addWriteRange(TaggedNodePointer &root, std::span begin, : std::max(p->entry.rangeVersion, writeContext->zero); if (beginIsPrefix) { // beginNode may have been invalidated when inserting end - beginNode = *useAsRoot; + beginNode = beginRoot; assert(beginNode->entryPresent); } endNode->entryPresent = true; @@ -3173,6 +3160,23 @@ void addWriteRange(TaggedNodePointer &root, std::span begin, fixupMaxVersion(iter, writeContext); } +void addWriteRange(TaggedNodePointer &root, std::span begin, + std::span end, InternalVersionT writeVersion, + WriteContext *writeContext, ConflictSet::Impl *impl) { + int lcp = longestCommonPrefix(begin.data(), end.data(), + std::min(begin.size(), end.size())); + if (lcp == int(begin.size()) && end.size() == begin.size() + 1 && + end.back() == 0) { + return addPointWrite(root, begin, writeVersion, writeContext); + } + 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); +} + Node *firstGeqPhysical(Node *n, const std::span key) { auto remaining = key; for (;;) {