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

range::do_gc()

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