Use forwarding pointers instead of beginIsPrefix

This commit is contained in:
2024-10-29 20:43:58 -07:00
parent 9015b555de
commit 958ee15cfc

View File

@@ -3108,10 +3108,15 @@ void fixupMaxVersion(Node *node, WriteContext *writeContext) {
setMaxVersion(node, max);
}
void addWriteRange(TaggedNodePointer &beginRoot, std::span<const uint8_t> begin,
TaggedNodePointer &endRoot, std::span<const uint8_t> end,
InternalVersionT writeVersion, WriteContext *writeContext,
ConflictSet::Impl *impl, bool beginIsPrefix) {
struct AddedWriteRange {
Node *beginNode;
Node *endNode;
};
AddedWriteRange
addWriteRange(TaggedNodePointer &beginRoot, std::span<const uint8_t> begin,
TaggedNodePointer &endRoot, std::span<const uint8_t> 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<const uint8_t> 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<const uint8_t> 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<const uint8_t> key) {