Store version instead of pointer to version
This commit is contained in:
@@ -1237,19 +1237,19 @@ void VersionedMap::Impl::firstGeq(const weaselab::VersionedMap::Key *key,
|
|||||||
|
|
||||||
const VersionedMap::Impl *map;
|
const VersionedMap::Impl *map;
|
||||||
const weaselab::VersionedMap::Key *key;
|
const weaselab::VersionedMap::Key *key;
|
||||||
const int64_t *version;
|
int64_t version;
|
||||||
weaselab::VersionedMap::Iterator *iterator;
|
weaselab::VersionedMap::Iterator *iterator;
|
||||||
|
|
||||||
void begin(RootSet::ThreadSafeHandle handle) {
|
void begin(RootSet::ThreadSafeHandle handle) {
|
||||||
uint32_t root;
|
uint32_t root;
|
||||||
if (iterator->impl != nullptr) {
|
if (iterator->impl != nullptr) {
|
||||||
root = iterator->impl->version == *version
|
root = iterator->impl->version == version
|
||||||
? iterator->impl->finger.root()
|
? iterator->impl->finger.root()
|
||||||
: handle.rootForVersion(*version);
|
: handle.rootForVersion(version);
|
||||||
iterator->impl->~Impl();
|
iterator->impl->~Impl();
|
||||||
new (iterator->impl) Iterator::Impl();
|
new (iterator->impl) Iterator::Impl();
|
||||||
} else {
|
} else {
|
||||||
root = handle.rootForVersion(*version);
|
root = handle.rootForVersion(version);
|
||||||
iterator->impl =
|
iterator->impl =
|
||||||
new (safe_malloc(sizeof(Iterator::Impl))) Iterator::Impl();
|
new (safe_malloc(sizeof(Iterator::Impl))) Iterator::Impl();
|
||||||
}
|
}
|
||||||
@@ -1271,7 +1271,7 @@ void VersionedMap::Impl::firstGeq(const weaselab::VersionedMap::Key *key,
|
|||||||
// No duplicates
|
// No duplicates
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
finger.push(map->child<std::memory_order_acquire>(n, c > 0, *version),
|
finger.push(map->child<std::memory_order_acquire>(n, c > 0, version),
|
||||||
c > 0);
|
c > 0);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -1279,13 +1279,13 @@ void VersionedMap::Impl::firstGeq(const weaselab::VersionedMap::Key *key,
|
|||||||
void end() {
|
void end() {
|
||||||
Finger &finger = iterator->impl->finger;
|
Finger &finger = iterator->impl->finger;
|
||||||
if (finger.searchPathSize() > 0 && finger.backNode() == 0) {
|
if (finger.searchPathSize() > 0 && finger.backNode() == 0) {
|
||||||
map->move<std::memory_order_acquire, true>(finger, *version);
|
map->move<std::memory_order_acquire, true>(finger, version);
|
||||||
if (finger.searchPathSize() > 0) {
|
if (finger.searchPathSize() > 0) {
|
||||||
assert(finger.backNode() != 0);
|
assert(finger.backNode() != 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
iterator->impl->version = *version;
|
iterator->impl->version = version;
|
||||||
iterator->impl->map = map;
|
iterator->impl->map = map;
|
||||||
|
|
||||||
const Entry *prev = nullptr;
|
const Entry *prev = nullptr;
|
||||||
@@ -1328,7 +1328,7 @@ void VersionedMap::Impl::firstGeq(const weaselab::VersionedMap::Key *key,
|
|||||||
for (int i = 0; i < count; ++i) {
|
for (int i = 0; i < count; ++i) {
|
||||||
stepwise[i].map = this;
|
stepwise[i].map = this;
|
||||||
stepwise[i].key = &key[i];
|
stepwise[i].key = &key[i];
|
||||||
stepwise[i].version = &version[i];
|
stepwise[i].version = version[i];
|
||||||
stepwise[i].iterator = &iterator[i];
|
stepwise[i].iterator = &iterator[i];
|
||||||
stepwise[i].begin(handle);
|
stepwise[i].begin(handle);
|
||||||
nextJob[i] = i + 1;
|
nextJob[i] = i + 1;
|
||||||
|
Reference in New Issue
Block a user