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) {
|
if (m.param2Len == 0) {
|
||||||
search<std::memory_order_relaxed>({m.param1, m.param1Len}, latestRoot,
|
search<std::memory_order_relaxed>({m.param1, m.param1Len}, latestRoot,
|
||||||
latestVersion, iter);
|
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();
|
bool engulfLeft = found && mm.base[iter.backNode()].entry->clearTo();
|
||||||
move<std::memory_order_relaxed, true>(iter, latestVersion);
|
bool engulfRight = false;
|
||||||
const auto *next = iter.searchPathSize() > 0
|
const Entry *next;
|
||||||
? mm.base[iter.backNode()].entry
|
Finger copy;
|
||||||
: nullptr;
|
|
||||||
if (engulfLeft && next && next->clearTo()) {
|
if (iter.searchPathSize() > 0) {
|
||||||
insert({next->getKey(), next->keyLen}, {}, iter);
|
iter.copyTo(copy);
|
||||||
move<std::memory_order_relaxed, false>(iter, latestVersion);
|
move<std::memory_order_relaxed, true>(copy, latestVersion);
|
||||||
remove(iter);
|
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 {
|
} else {
|
||||||
search<std::memory_order_relaxed>({m.param1, m.param1Len}, latestRoot,
|
search<std::memory_order_relaxed>({m.param1, m.param1Len}, latestRoot,
|
||||||
latestVersion, iter);
|
latestVersion, iter);
|
||||||
|
Reference in New Issue
Block a user