提交 61d2b152 创建 作者: Frans Kaashoek's avatar Frans Kaashoek

Switch c++ version of crange

Much room for cleanup
上级 4fa476e9
差异被折叠。
......@@ -56,29 +56,6 @@ void consoleintr(int(*)(void));
#define assert(c) if (!(c)) { cprintf("%s:%d: ", __FILE__, __LINE__); panic("assertion failure"); }
// crange.c
struct range {
u64 key;
u64 size;
void *value;
int curlevel; // the current levels it appears on
int nlevel; // the number of levels this range should appear
struct crange *cr; // the crange this range is part of
struct range** next; // one next pointer per level
struct spinlock *lock; // on separate cache line?
} __mpalign__;
struct crange {
int nlevel; // number of levels in the crange skip list
struct range crange_head; // a crange skip list starts with a sentinel range (key 0, sz 0)
};
struct crange* crange_alloc(int nlevel);
void crange_free(struct crange *cr);
void crange_del(struct crange *cr, u64 k, u64 sz);
void crange_add(struct crange *cr, u64 k, u64 sz, void *v);
struct range* crange_search(struct crange *cr, u64 k, u64 sz, int mod);
int crange_foreach(struct crange *crk, int (*f)(struct range *r, void *st), void *st);
void crange_print(struct crange *cr, int);
// e1000.c
extern int e1000irq;
......
......@@ -14,6 +14,7 @@ extern "C" {
#include "vm.hh"
#include "gc.hh"
#include "crange.hh"
static void vmap_free(void *p);
......@@ -114,7 +115,7 @@ vmap_alloc(void)
return 0;
}
#ifdef TREE
m->cr = crange_alloc(10);
m->cr = new crange(10);
if (m->cr == 0)
return 0;
#endif
......@@ -313,10 +314,10 @@ struct state {
};
static int
vmap_free_vma(struct range *r, void *st)
vmap_free_vma(range *r, void *st)
{
delete (vma *) r->value;
crange_del(r->cr, r->key, r->size);
r->cr->del(r->key, r->size);
return 1;
}
......@@ -324,8 +325,8 @@ static void
vmap_free(void *p)
{
struct vmap *m = (struct vmap *) p;
crange_foreach(m->cr, vmap_free_vma, NULL);
crange_free(m->cr);
m->cr->foreach(vmap_free_vma, NULL);
delete m->cr;
ksfree(slab_kshared, m->kshared);
freevm(m->pml4);
m->pml4 = 0;
......@@ -346,7 +347,7 @@ vmap_lookup(struct vmap *m, uptr start, uptr len)
if(start + len < start)
panic("vmap_lookup bad len");
struct range *r = crange_search(m->cr, start, len, 0);
range *r = m->cr->search(start, len, 0);
if (r != 0) {
struct vma *e = (struct vma *) (r->value);
if (e->va_end <= e->va_start)
......@@ -380,7 +381,7 @@ vmap_insert(struct vmap *m, struct vmnode *n, uptr va_start)
e->va_end = va_start + len;
e->n = n;
__sync_fetch_and_add(&n->ref, 1);
crange_add(m->cr, e->va_start, len, (void *) e);
m->cr->add(e->va_start, len, (void *) e);
release(&m->lock);
return 0;
}
......@@ -411,7 +412,7 @@ vmap_copy_vma(struct range *r, void *_st)
return 0;
}
__sync_fetch_and_add(&c->n->ref, 1);
crange_add(st->cr, c->va_start, c->va_end - c->va_start, (void *) c);
st->cr->add(c->va_start, c->va_end - c->va_start, (void *) c);
return 1;
}
......@@ -427,7 +428,7 @@ vmap_copy(struct vmap *m, int share)
st.share = share;
st.pml4 = m->pml4;
st.cr = c->cr;
if (!crange_foreach(m->cr, vmap_copy_vma, &st)) {
if (!m->cr->foreach(vmap_copy_vma, &st)) {
vmap_free(c);
release(&m->lock);
return 0;
......@@ -445,7 +446,7 @@ vmap_remove(struct vmap *m, uptr va_start, u64 len)
{
acquire(&m->lock);
uptr va_end = va_start + len;
struct range *r = crange_search(m->cr, va_start, len, 0);
struct range *r = m->cr->search(va_start, len, 0);
if (r == 0)
panic("no vma?");
struct vma *e = (struct vma *) r->value;
......@@ -454,7 +455,7 @@ vmap_remove(struct vmap *m, uptr va_start, u64 len)
release(&m->lock);
return -1;
}
crange_del(m->cr, va_start, len);
m->cr->del(va_start, len);
gc_delayed(e);
release(&m->lock);
return 0;
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论