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

range::do_gc()

上级 c6b099ce
......@@ -3,19 +3,27 @@ extern "C" {
#include "kernel.h"
}
#include "cpputil.hh"
void *
operator new(unsigned long nbytes)
{
return kmalloc(nbytes);
}
void *
operator new(unsigned long nbytes, void *buf)
{
return buf;
}
void
operator delete(void *p)
{
kmfree(p);
}
extern "C" void
void
__cxa_pure_virtual(void)
{
panic("__cxa_pure_virtual");
......
......@@ -33,3 +33,10 @@ mkpair(const A &a, const B &b)
{
return pair<A, B>(a, b);
}
/* C++ runtime */
void *operator new(unsigned long nbytes);
void *operator new(unsigned long nbytes, void *buf);
void operator delete(void *p);
extern "C" void __cxa_pure_virtual(void);
......@@ -10,6 +10,7 @@ extern "C" {
}
#include "gc.hh"
#include "cpputil.hh"
//
// Concurrent atomic range operations using skip lists. An insert may split an
......@@ -105,17 +106,11 @@ range_free(void *p)
kmalignfree(e);
}
class range_delayed : public rcu_freed {
private:
struct range *_e;
public:
range_delayed(range *e) : rcu_freed("range_delayed"), _e(e) {}
virtual void do_gc() {
range_free(_e);
delete this;
}
};
void
range::do_gc()
{
range_free(this);
}
static void
range_free_delayed(struct range *e)
......@@ -124,9 +119,7 @@ range_free_delayed(struct range *e)
cprintf("%d: range_free_delayed: 0x%lx 0x%lx-0x%lx(%lu) %lu\n", myproc()->pid, (long) e, e->key, e->key + (e)->size, e->size, myproc()->epoch);
crange_check(e->cr, e);
assert(e->curlevel == -1);
range_delayed *rd = new range_delayed(e);
gc_delayed(rd);
gc_delayed(e);
}
static void
......@@ -141,9 +134,11 @@ range_dec_ref(struct range *e)
static struct range *
range_alloc(struct crange *cr, u64 k, u64 sz, void *v, struct range *n)
{
struct range *r;
kmalign((void **) &r, CACHELINE, sizeof(struct range));
assert(r);
void *rangemem;
kmalign(&rangemem, CACHELINE, sizeof(struct range));
assert(rangemem);
struct range *r = new(rangemem) range();
r->key = k;
r->size = sz;
r->value = v;
......
......@@ -56,7 +56,10 @@ void consoleintr(int(*)(void));
#define assert(c) if (!(c)) { cprintf("%s:%d: ", __FILE__, __LINE__); panic("assertion failure"); }
// crange.c
struct range {
#if __cplusplus
#include "gc.hh"
struct range : public rcu_freed {
u64 key;
u64 size;
void *value;
......@@ -65,6 +68,9 @@ struct range {
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?
range() : rcu_freed("range") {}
void do_gc();
} __mpalign__;
struct crange {
......@@ -79,6 +85,7 @@ 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);
#endif
// e1000.c
extern int e1000irq;
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论