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

no need to keep track of first & last -- prev & succ is sufficient

上级 58bb7de1
...@@ -176,14 +176,12 @@ struct crange_locked { ...@@ -176,14 +176,12 @@ struct crange_locked {
const u64 base_, size_; const u64 base_, size_;
range *const prev_; range *const prev_;
range *first_;
range *last_;
range *const succ_; range *const succ_;
bool moved_; bool moved_;
scoped_gc_epoch gc; scoped_gc_epoch gc;
crange_locked(crange *cr, u64 base, u64 size, range *p, range *f, range *l, range *s); crange_locked(crange *cr, u64 base, u64 size, range *p, range *s);
crange_locked(const crange_locked&) = delete; crange_locked(const crange_locked&) = delete;
crange_locked& operator=(const crange_locked&) = delete; crange_locked& operator=(const crange_locked&) = delete;
friend class crange; friend class crange;
...@@ -192,7 +190,7 @@ struct crange_locked { ...@@ -192,7 +190,7 @@ struct crange_locked {
crange_locked(crange_locked &&x); crange_locked(crange_locked &&x);
~crange_locked(); ~crange_locked();
range_iterator begin() const { return range_iterator(first_ ?: succ_); }; range_iterator begin() const { return range_iterator(prev_->next[0].ptr()); };
range_iterator end() const { return range_iterator(succ_); }; range_iterator end() const { return range_iterator(succ_); };
void replace(range *r); void replace(range *r);
}; };
......
...@@ -164,22 +164,6 @@ crange::mark(range *f, range *s) ...@@ -164,22 +164,6 @@ crange::mark(range *f, range *s)
} }
} }
// Delay free ranges f through l
void
crange::freen(struct range *f, struct range *l)
{
struct range *e;
for (e = f; e && e != l; e = e->next[0].ptr()) {
assert(e);
assert(e->curlevel >= 0);
e->dec_ref();
}
if (l) {
assert(e->curlevel >= 0);
e->dec_ref();
}
}
// //
// Methods on a crange // Methods on a crange
// //
...@@ -462,11 +446,11 @@ crange::search_lock(u64 k, u64 sz) ...@@ -462,11 +446,11 @@ crange::search_lock(u64 k, u64 sz)
{ {
range *prev, *first, *last, *succ; range *prev, *first, *last, *succ;
find_and_lock(k, sz, &prev, &first, &last, &succ); find_and_lock(k, sz, &prev, &first, &last, &succ);
return crange_locked(this, k, sz, prev, first, last, succ); return crange_locked(this, k, sz, prev, succ);
} }
crange_locked::crange_locked(crange *cr, u64 base, u64 sz, range *p, range *f, range *l, range *s) crange_locked::crange_locked(crange *cr, u64 base, u64 sz, range *p, range *s)
: cr_(cr), base_(base), size_(sz), prev_(p), first_(f), last_(l), succ_(s), moved_(false) : cr_(cr), base_(base), size_(sz), prev_(p), succ_(s), moved_(false)
{ {
} }
...@@ -475,8 +459,6 @@ crange_locked::crange_locked(crange_locked &&x) ...@@ -475,8 +459,6 @@ crange_locked::crange_locked(crange_locked &&x)
base_(x.base_), base_(x.base_),
size_(x.size_), size_(x.size_),
prev_(x.prev_), prev_(x.prev_),
first_(x.first_),
last_(x.last_),
succ_(x.succ_), succ_(x.succ_),
moved_(false), moved_(false),
gc(std::move(x.gc)) gc(std::move(x.gc))
...@@ -511,13 +493,12 @@ crange_locked::replace(range *repl) ...@@ -511,13 +493,12 @@ crange_locked::replace(range *repl)
// do compare-exchange first, and only then mark the old ranges as deleted; // do compare-exchange first, and only then mark the old ranges as deleted;
// otherwise, concurrent readers may not find either old or new ranges. // otherwise, concurrent readers may not find either old or new ranges.
assert(prev_->next[0].cmpxch(first_?:succ_, repl?:succ_)); range *replaced = prev_->next[0].ptr();
crange::mark(first_, succ_); prev_->next[0] = repl ?: succ_;
crange::mark(replaced, succ_);
for (range *e = first_; e && e != succ_; e = e->next[0].ptr()) for (range *e = replaced; e && e != succ_; e = e->next[0].ptr()) {
release(e->lock); release(e->lock);
crange::freen(first_, last_); e->dec_ref();
}
first_ = repl;
last_ = newlast;
} }
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论