Fix thread safety issue

This commit is contained in:
2024-05-09 13:42:42 -07:00
parent a36c96d7c2
commit fbd5292478

View File

@@ -530,7 +530,7 @@ struct VersionedMap::Impl {
int len; int len;
}; };
Finger search(Key key, int64_t at) const { template <std::memory_order kOrder> Finger search(Key key, int64_t at) const {
Finger finger; Finger finger;
bool ignored; bool ignored;
finger.push(latestRoot, ignored); finger.push(latestRoot, ignored);
@@ -546,8 +546,7 @@ struct VersionedMap::Impl {
// No duplicates // No duplicates
break; break;
} }
finger.push(child<std::memory_order_relaxed>(n, c > 0, latestVersion), finger.push(child<kOrder>(n, c > 0, latestVersion), c > 0);
c > 0);
} }
return finger; return finger;
} }
@@ -745,7 +744,8 @@ struct VersionedMap::Impl {
case Clear: { case Clear: {
insert({m.param1, m.param1Len}, {{nullptr, -1}}); insert({m.param1, m.param1Len}, {{nullptr, -1}});
if (m.param2Len > 0) { if (m.param2Len > 0) {
auto iter = search({m.param1, m.param1Len}, latestVersion); auto iter = search<std::memory_order_relaxed>({m.param1, m.param1Len},
latestVersion);
move<std::memory_order_relaxed>(iter, latestVersion, true); move<std::memory_order_relaxed>(iter, latestVersion, true);
while (iter.searchPathSize() > 0 && while (iter.searchPathSize() > 0 &&
mm.base[iter.backNode()] < Key{m.param2, m.param2Len}) { mm.base[iter.backNode()] < Key{m.param2, m.param2Len}) {
@@ -925,7 +925,7 @@ void VersionedMap::Impl::firstGeq(const Key *key, const int64_t *version,
// TODO ILP! // TODO ILP!
for (int i = 0; i < count; ++i) { for (int i = 0; i < count; ++i) {
// TODO re-use root if passed-in iterator version matches // TODO re-use root if passed-in iterator version matches
auto finger = search(key[i], version[i]); auto finger = search<std::memory_order_acquire>(key[i], version[i]);
if (iterator[i].impl != nullptr) { if (iterator[i].impl != nullptr) {
iterator[i].impl->~Impl(); iterator[i].impl->~Impl();
} }