Use forwarding pointers instead of beginIsPrefix
This commit is contained in:
@@ -3108,10 +3108,15 @@ void fixupMaxVersion(Node *node, WriteContext *writeContext) {
|
||||
setMaxVersion(node, max);
|
||||
}
|
||||
|
||||
void addWriteRange(TaggedNodePointer &beginRoot, std::span<const uint8_t> begin,
|
||||
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,
|
||||
ConflictSet::Impl *impl, bool beginIsPrefix) {
|
||||
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) {
|
||||
|
Reference in New Issue
Block a user