diff --git a/ConflictSet.cpp b/ConflictSet.cpp index 391af61..f658eba 100644 --- a/ConflictSet.cpp +++ b/ConflictSet.cpp @@ -1229,6 +1229,10 @@ bool checkRangeRead(Node *n, std::span begin, std::span end, int64_t readVersion) { 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 checkPointRead(n, begin, readVersion); + } SearchStepWise search{n, begin.subspan(0, lcp)}; Arena arena; @@ -1390,6 +1394,23 @@ void destroyTree(Node *root) { } } +void addPointWrite(Node *&root, int64_t oldestVersion, + const ConflictSet::WriteRange &w) { + auto *n = insert(&root, std::span(w.begin.p, w.begin.len), + w.writeVersion, true); + if (!n->entryPresent) { + auto *p = nextLogical(n); + n->entryPresent = true; + n->entry.pointVersion = w.writeVersion; + n->maxVersion = w.writeVersion; + n->entry.rangeVersion = + p != nullptr ? p->entry.rangeVersion : oldestVersion; + } else { + n->entry.pointVersion = std::max(n->entry.pointVersion, w.writeVersion); + n->maxVersion = std::max(n->maxVersion, w.writeVersion); + } +} + void addWriteRange(Node *&root, int64_t oldestVersion, const ConflictSet::WriteRange &w) { @@ -1398,6 +1419,10 @@ void addWriteRange(Node *&root, int64_t oldestVersion, 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, oldestVersion, w); + } auto remaining = begin.subspan(0, lcp); auto *n = root; @@ -1619,21 +1644,7 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl { addWriteRange(root, oldestVersion, w); } else { keyUpdates += 1; - auto *n = - insert(&root, std::span(w.begin.p, w.begin.len), - w.writeVersion, true); - if (!n->entryPresent) { - auto *p = nextLogical(n); - n->entryPresent = true; - n->entry.pointVersion = w.writeVersion; - n->maxVersion = w.writeVersion; - n->entry.rangeVersion = - p != nullptr ? p->entry.rangeVersion : oldestVersion; - } else { - n->entry.pointVersion = - std::max(n->entry.pointVersion, w.writeVersion); - n->maxVersion = std::max(n->maxVersion, w.writeVersion); - } + addPointWrite(root, oldestVersion, w); } } }