From e480f66846f474b36553f816af77d8b6b5db6928 Mon Sep 17 00:00:00 2001 From: Andrew Noyes Date: Thu, 15 Aug 2024 17:05:10 -0700 Subject: [PATCH] Have caller ensure root max version for insert --- ConflictSet.cpp | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/ConflictSet.cpp b/ConflictSet.cpp index dcd3100..01d1967 100644 --- a/ConflictSet.cpp +++ b/ConflictSet.cpp @@ -2799,14 +2799,11 @@ checkMaxBetweenExclusiveImpl(Node *n, int begin, int end, // Returns a pointer the pointer to the newly inserted node in the tree. Caller // must set `entryPresent`, and `entry` fields. All nodes along the search path // of the result will have `maxVersion` set to `writeVersion` as a -// postcondition. Nodes along the search path may be invalidated. +// postcondition. Nodes along the search path may be invalidated. Callers must +// ensure that the max version of the self argument is updated. [[nodiscard]] Node **insert(Node **self, std::span key, - InternalVersionT writeVersion, WriteContext *tls, - ConflictSet::Impl *impl) { - - assert(maxVersion(*self, impl) <= writeVersion); - setMaxVersion(*self, impl, writeVersion); + InternalVersionT writeVersion, WriteContext *tls) { for (; key.size() != 0; ++tls->accum.insert_iterations) { self = &getOrCreateChild(*self, key, writeVersion, tls); @@ -2862,10 +2859,9 @@ void eraseTree(Node *root, WriteContext *tls) { } void addPointWrite(Node *&root, std::span key, - InternalVersionT writeVersion, WriteContext *tls, - ConflictSet::Impl *impl) { + InternalVersionT writeVersion, WriteContext *tls) { ++tls->accum.point_writes; - auto *n = *insert(&root, key, writeVersion, tls, impl); + auto *n = *insert(&root, key, writeVersion, tls); if (!n->entryPresent) { ++tls->accum.entries_inserted; auto *p = nextLogical(n); @@ -2928,18 +2924,17 @@ void addWriteRange(Node *&root, std::span begin, std::min(begin.size(), end.size())); if (lcp == int(begin.size()) && end.size() == begin.size() + 1 && end.back() == 0) { - return addPointWrite(root, begin, writeVersion, tls, impl); + return addPointWrite(root, begin, writeVersion, tls); } ++tls->accum.range_writes; const bool beginIsPrefix = lcp == int(begin.size()); - Node **useAsRoot = - insert(&root, begin.subspan(0, lcp), writeVersion, tls, impl); + Node **useAsRoot = insert(&root, begin.subspan(0, lcp), writeVersion, tls); begin = begin.subspan(lcp, begin.size() - lcp); end = end.subspan(lcp, end.size() - lcp); - auto *beginNode = *insert(useAsRoot, begin, writeVersion, tls, impl); + auto *beginNode = *insert(useAsRoot, begin, writeVersion, tls); addKey(beginNode); if (!beginNode->entryPresent) { ++tls->accum.entries_inserted; @@ -2950,7 +2945,7 @@ void addWriteRange(Node *&root, std::span begin, } beginNode->entry.pointVersion = writeVersion; - auto *endNode = *insert(useAsRoot, end, writeVersion, tls, impl); + auto *endNode = *insert(useAsRoot, end, writeVersion, tls); addKey(endNode); if (!endNode->entryPresent) { ++tls->accum.entries_inserted; @@ -3108,7 +3103,7 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl { addWriteRange(root, begin, end, InternalVersionT(writeVersion), &tls, this); } else { - addPointWrite(root, begin, InternalVersionT(writeVersion), &tls, this); + addPointWrite(root, begin, InternalVersionT(writeVersion), &tls); } }