Clarify buffer reclamation condition
This commit is contained in:
@@ -105,12 +105,15 @@ struct RootSet::Impl {
|
|||||||
|
|
||||||
void setOldestVersion(int64_t oldestVersion) {
|
void setOldestVersion(int64_t oldestVersion) {
|
||||||
this->oldestVersion = oldestVersion;
|
this->oldestVersion = oldestVersion;
|
||||||
// This condition is basically "while it would be incorrect to read
|
// The next buffer has an entry greater than all entries in this buffer.
|
||||||
// firstToFree at oldestVersion - 1"
|
// If the next buffer does not have an entry > `oldestVersion`, then this
|
||||||
|
// buffer is missing an entry <= oldestVersion on the right, so it's
|
||||||
|
// incorrect to read this buffer at `oldestVersion` and we can safely free
|
||||||
|
// it.
|
||||||
while (firstToFree != nullptr && firstToFree->next != nullptr &&
|
while (firstToFree != nullptr && firstToFree->next != nullptr &&
|
||||||
firstToFree->next->versions()[firstToFree->next->end.load(
|
firstToFree->next->versions()[firstToFree->next->end.load(
|
||||||
std::memory_order_relaxed) -
|
std::memory_order_relaxed) -
|
||||||
1] < oldestVersion) {
|
1] <= oldestVersion) {
|
||||||
auto *tmp = firstToFree;
|
auto *tmp = firstToFree;
|
||||||
firstToFree = firstToFree->next;
|
firstToFree = firstToFree->next;
|
||||||
free(tmp);
|
free(tmp);
|
||||||
|
Reference in New Issue
Block a user