Fix thread safety issue
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
Reference in New Issue
Block a user