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

range-based for loop seems a better fit for iterating over crange

上级 e31c700a
......@@ -83,7 +83,7 @@ class markptr_mark : public markptr<T> {
};
struct range : public rcu_freed {
public:
public:
u64 key;
u64 size;
void *value;
......@@ -103,10 +103,22 @@ public:
int lockif(markptr<range> e);
} __mpalign__;
class range_iterator {
private:
range *_e;
public:
range_iterator(range *e) : _e(e) {}
range_iterator& operator++() { _e = _e->next[0].ptr(); return *this; }
range*& operator*() { return _e; }
bool operator==(const range_iterator &other) { return _e == other._e; }
bool operator!=(const range_iterator &other) { return _e != other._e; }
};
struct crange {
private:
private:
range *crange_head; // a crange skip list starts with a sentinel range (key 0, sz 0)
public:
public:
int nlevel; // number of levels in the crange skip list
crange(int nlevel);
~crange(void);
......@@ -120,12 +132,18 @@ public:
int lock_range(u64 k, u64 sz, int l, range **er, range **pr, range **fr, range **lr, range **sr);
int find_and_lock(u64 k, u64 sz, range **p0, range **f0, range **l0, range **s0);
template<class CB>
bool foreach(CB cb) {
for (range *e = crange_head->next[0].ptr(); e; e = e->next[0].ptr())
if (!cb(e))
return false;
return true;
}
range_iterator begin() { return range_iterator(crange_head->next[0].ptr()); };
range_iterator end() { return range_iterator(0); };
};
static inline range_iterator
begin(crange *cr)
{
return cr->begin();
}
static inline range_iterator
end(crange *cr)
{
return cr->end();
}
......@@ -311,11 +311,12 @@ static void
vmap_free(void *p)
{
struct vmap *m = (struct vmap *) p;
m->cr->foreach([](range *r) {
for (range *r: m->cr) {
delete (vma*) r->value;
r->cr->del(r->key, r->size);
return true;
});
}
delete m->cr;
ksfree(slab_kshared, m->kshared);
freevm(m->pml4);
......@@ -384,11 +385,11 @@ vmap_copy(struct vmap *m, int share)
return 0;
acquire(&m->lock);
if (!m->cr->foreach([share, m, nm](range *r) -> bool {
for (range *r: m->cr) {
struct vma *e = (struct vma *) r->value;
struct vma *ne = new vma();
if (ne == 0)
return false;
goto err;
ne->va_start = e->va_start;
ne->va_end = e->va_end;
......@@ -405,16 +406,10 @@ vmap_copy(struct vmap *m, int share)
}
if(ne->n == 0)
return false;
goto err;
ne->n->ref++;
nm->cr->add(ne->va_start, ne->va_end - ne->va_start, (void *) ne);
return true;
}))
{
vmap_free(nm);
release(&m->lock);
return 0;
}
if (share)
......@@ -422,6 +417,11 @@ vmap_copy(struct vmap *m, int share)
release(&m->lock);
return nm;
err:
vmap_free(nm);
release(&m->lock);
return 0;
}
int
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论