提交 ea058e70 创建 作者: Nickolai Zeldovich's avatar Nickolai Zeldovich

when unlocking a sequence of ranges (in crange_locked), we need to first

read the next pointer, and then unlock a node. otherwise, the next pointer changes and we try to unlock subsequent nodes that we never locked.
上级 6150f2f6
...@@ -119,7 +119,7 @@ range::dec_ref(void) ...@@ -119,7 +119,7 @@ range::dec_ref(void)
range::range(crange *crarg, u64 k, u64 sz, rcu_freed *v, range *n, int nl) range::range(crange *crarg, u64 k, u64 sz, rcu_freed *v, range *n, int nl)
: rcu_freed("range_delayed") : rcu_freed("range_delayed")
{ {
dprintf("range:range:: %lu %lu %d\n", k, sz, nl); dprintf("range::range: %lu %lu %d\n", k, sz, nl);
key = k; key = k;
size = sz; size = sz;
value = v; value = v;
...@@ -500,9 +500,13 @@ crange_locked::crange_locked(crange_locked &&x) ...@@ -500,9 +500,13 @@ crange_locked::crange_locked(crange_locked &&x)
crange_locked::~crange_locked() crange_locked::~crange_locked()
{ {
if (prev_) { if (prev_) {
for (range *e = prev_; e && e != succ_; e = e->next[0].ptr()) range *n;
for (range *e = prev_; e && e != succ_; e = n) {
// as soon a we release, the next pointer can change, so read it first
n = e->next[0].ptr();
release(e->lock); release(e->lock);
} }
}
} }
void void
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论