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;
};
Finger search(Key key, int64_t at) const {
template <std::memory_order kOrder> Finger search(Key key, int64_t at) const {
Finger finger;
bool ignored;
finger.push(latestRoot, ignored);
@@ -546,8 +546,7 @@ struct VersionedMap::Impl {
// No duplicates
break;
}
finger.push(child<std::memory_order_relaxed>(n, c > 0, latestVersion),
c > 0);
finger.push(child<kOrder>(n, c > 0, latestVersion), c > 0);
}
return finger;
}
@@ -745,7 +744,8 @@ struct VersionedMap::Impl {
case Clear: {
insert({m.param1, m.param1Len}, {{nullptr, -1}});
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);
while (iter.searchPathSize() > 0 &&
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!
for (int i = 0; i < count; ++i) {
// 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) {
iterator[i].impl->~Impl();
}