Avoid some insertions in point clears

This commit is contained in:
2024-06-14 16:00:08 -07:00
parent 551f34baf4
commit 729fcdb616

View File

@@ -902,19 +902,34 @@ struct __attribute__((__visibility__("hidden"))) VersionedMap::Impl {
if (m.param2Len == 0) {
search<std::memory_order_relaxed>({m.param1, m.param1Len}, latestRoot,
latestVersion, iter);
insert({m.param1, m.param1Len}, {{nullptr, -1}}, iter);
const bool found = iter.searchPathSize() > 0 && iter.backNode() != 0;
const bool engulfLeft = mm.base[iter.backNode()].entry->clearTo();
move<std::memory_order_relaxed, true>(iter, latestVersion);
const auto *next = iter.searchPathSize() > 0
? mm.base[iter.backNode()].entry
: nullptr;
if (engulfLeft && next && next->clearTo()) {
insert({next->getKey(), next->keyLen}, {}, iter);
move<std::memory_order_relaxed, false>(iter, latestVersion);
remove(iter);
bool engulfLeft = found && mm.base[iter.backNode()].entry->clearTo();
bool engulfRight = false;
const Entry *next;
Finger copy;
if (iter.searchPathSize() > 0) {
iter.copyTo(copy);
move<std::memory_order_relaxed, true>(copy, latestVersion);
next = copy.searchPathSize() > 0 ? mm.base[copy.backNode()].entry
: nullptr;
if (next && next->clearTo()) {
engulfRight = true;
if (!found) {
engulfLeft = true;
}
}
}
if (engulfLeft && engulfRight) {
insert({next->getKey(), next->keyLen}, {}, copy);
if (found) {
remove(iter);
}
} else {
insert({m.param1, m.param1Len}, {{nullptr, -1}}, iter);
}
} else {
search<std::memory_order_relaxed>({m.param1, m.param1Len}, latestRoot,
latestVersion, iter);