提交 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)
range::range(crange *crarg, u64 k, u64 sz, rcu_freed *v, range *n, int nl)
: 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;
size = sz;
value = v;
......@@ -500,8 +500,12 @@ crange_locked::crange_locked(crange_locked &&x)
crange_locked::~crange_locked()
{
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);
}
}
}
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论