提交 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)); ...@@ -56,29 +56,6 @@ void consoleintr(int(*)(void));
#define assert(c) if (!(c)) { cprintf("%s:%d: ", __FILE__, __LINE__); panic("assertion failure"); } #define assert(c) if (!(c)) { cprintf("%s:%d: ", __FILE__, __LINE__); panic("assertion failure"); }
// crange.c // 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 // e1000.c
extern int e1000irq; extern int e1000irq;
......
...@@ -14,6 +14,7 @@ extern "C" { ...@@ -14,6 +14,7 @@ extern "C" {
#include "vm.hh" #include "vm.hh"
#include "gc.hh" #include "gc.hh"
#include "crange.hh"
static void vmap_free(void *p); static void vmap_free(void *p);
...@@ -114,7 +115,7 @@ vmap_alloc(void) ...@@ -114,7 +115,7 @@ vmap_alloc(void)
return 0; return 0;
} }
#ifdef TREE #ifdef TREE
m->cr = crange_alloc(10); m->cr = new crange(10);
if (m->cr == 0) if (m->cr == 0)
return 0; return 0;
#endif #endif
...@@ -313,10 +314,10 @@ struct state { ...@@ -313,10 +314,10 @@ struct state {
}; };
static int static int
vmap_free_vma(struct range *r, void *st) vmap_free_vma(range *r, void *st)
{ {
delete (vma *) r->value; delete (vma *) r->value;
crange_del(r->cr, r->key, r->size); r->cr->del(r->key, r->size);
return 1; return 1;
} }
...@@ -324,8 +325,8 @@ static void ...@@ -324,8 +325,8 @@ static void
vmap_free(void *p) vmap_free(void *p)
{ {
struct vmap *m = (struct vmap *) p; struct vmap *m = (struct vmap *) p;
crange_foreach(m->cr, vmap_free_vma, NULL); m->cr->foreach(vmap_free_vma, NULL);
crange_free(m->cr); delete m->cr;
ksfree(slab_kshared, m->kshared); ksfree(slab_kshared, m->kshared);
freevm(m->pml4); freevm(m->pml4);
m->pml4 = 0; m->pml4 = 0;
...@@ -346,7 +347,7 @@ vmap_lookup(struct vmap *m, uptr start, uptr len) ...@@ -346,7 +347,7 @@ vmap_lookup(struct vmap *m, uptr start, uptr len)
if(start + len < start) if(start + len < start)
panic("vmap_lookup bad len"); 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) { if (r != 0) {
struct vma *e = (struct vma *) (r->value); struct vma *e = (struct vma *) (r->value);
if (e->va_end <= e->va_start) if (e->va_end <= e->va_start)
...@@ -380,7 +381,7 @@ vmap_insert(struct vmap *m, struct vmnode *n, uptr va_start) ...@@ -380,7 +381,7 @@ vmap_insert(struct vmap *m, struct vmnode *n, uptr va_start)
e->va_end = va_start + len; e->va_end = va_start + len;
e->n = n; e->n = n;
__sync_fetch_and_add(&n->ref, 1); __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); release(&m->lock);
return 0; return 0;
} }
...@@ -411,7 +412,7 @@ vmap_copy_vma(struct range *r, void *_st) ...@@ -411,7 +412,7 @@ vmap_copy_vma(struct range *r, void *_st)
return 0; return 0;
} }
__sync_fetch_and_add(&c->n->ref, 1); __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; return 1;
} }
...@@ -427,7 +428,7 @@ vmap_copy(struct vmap *m, int share) ...@@ -427,7 +428,7 @@ vmap_copy(struct vmap *m, int share)
st.share = share; st.share = share;
st.pml4 = m->pml4; st.pml4 = m->pml4;
st.cr = c->cr; st.cr = c->cr;
if (!crange_foreach(m->cr, vmap_copy_vma, &st)) { if (!m->cr->foreach(vmap_copy_vma, &st)) {
vmap_free(c); vmap_free(c);
release(&m->lock); release(&m->lock);
return 0; return 0;
...@@ -445,7 +446,7 @@ vmap_remove(struct vmap *m, uptr va_start, u64 len) ...@@ -445,7 +446,7 @@ vmap_remove(struct vmap *m, uptr va_start, u64 len)
{ {
acquire(&m->lock); acquire(&m->lock);
uptr va_end = va_start + len; 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) if (r == 0)
panic("no vma?"); panic("no vma?");
struct vma *e = (struct vma *) r->value; struct vma *e = (struct vma *) r->value;
...@@ -454,7 +455,7 @@ vmap_remove(struct vmap *m, uptr va_start, u64 len) ...@@ -454,7 +455,7 @@ vmap_remove(struct vmap *m, uptr va_start, u64 len)
release(&m->lock); release(&m->lock);
return -1; return -1;
} }
crange_del(m->cr, va_start, len); m->cr->del(va_start, len);
gc_delayed(e); gc_delayed(e);
release(&m->lock); release(&m->lock);
return 0; return 0;
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论