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