Avoid some insertions in point clears
This commit is contained in:
@@ -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);
|
||||
|
Reference in New Issue
Block a user