提交 4fa476e9 创建 作者: Silas Boyd-Wickizer's avatar Silas Boyd-Wickizer

Merge conflicts

...@@ -13,7 +13,7 @@ struct buf : public rcu_freed { ...@@ -13,7 +13,7 @@ struct buf : public rcu_freed {
u8 data[512]; u8 data[512];
buf() : rcu_freed("buf") {} buf() : rcu_freed("buf") {}
virtual ~buf() {} virtual void do_gc() { delete this; }
}; };
#define B_BUSY 0x1 // buffer is locked by some process #define B_BUSY 0x1 // buffer is locked by some process
#define B_VALID 0x2 // buffer has been read from disk #define B_VALID 0x2 // buffer has been read from disk
......
...@@ -14,3 +14,9 @@ operator delete(void *p) ...@@ -14,3 +14,9 @@ operator delete(void *p)
{ {
kmfree(p); kmfree(p);
} }
extern "C" void
__cxa_pure_virtual(void)
{
panic("__cxa_pure_virtual");
}
...@@ -111,8 +111,9 @@ class range_delayed : public rcu_freed { ...@@ -111,8 +111,9 @@ class range_delayed : public rcu_freed {
public: public:
range_delayed(range *e) : rcu_freed("range_delayed"), _e(e) {} range_delayed(range *e) : rcu_freed("range_delayed"), _e(e) {}
virtual ~range_delayed() { virtual void do_gc() {
range_free(_e); range_free(_e);
delete this;
} }
}; };
......
...@@ -39,7 +39,8 @@ struct inode : public rcu_freed { ...@@ -39,7 +39,8 @@ struct inode : public rcu_freed {
u32 addrs[NDIRECT+1]; u32 addrs[NDIRECT+1];
inode(); inode();
virtual ~inode(); ~inode();
virtual void do_gc() { delete this; }
}; };
#define I_BUSYR 0x1 #define I_BUSYR 0x1
......
...@@ -485,8 +485,9 @@ class diskblock : public rcu_freed { ...@@ -485,8 +485,9 @@ class diskblock : public rcu_freed {
public: public:
diskblock(int dev, u64 block) : rcu_freed("diskblock"), _dev(dev), _block(block) {} diskblock(int dev, u64 block) : rcu_freed("diskblock"), _dev(dev), _block(block) {}
virtual ~diskblock() { virtual void do_gc() {
bfree(_dev, _block); bfree(_dev, _block);
delete this;
} }
}; };
......
...@@ -63,7 +63,7 @@ gc_free_tofreelist(rcu_freed **head, u64 epoch) ...@@ -63,7 +63,7 @@ gc_free_tofreelist(rcu_freed **head, u64 epoch)
assert(0); assert(0);
} }
nr = r->_rcu_next; nr = r->_rcu_next;
delete r; r->do_gc();
nfree++; nfree++;
} }
*head = r; *head = r;
......
...@@ -16,5 +16,5 @@ class rcu_freed { ...@@ -16,5 +16,5 @@ class rcu_freed {
#endif #endif
{} {}
virtual ~rcu_freed() {} virtual void do_gc(void) = 0;
} __mpalign__; } __mpalign__;
...@@ -27,7 +27,7 @@ struct klockstat : public rcu_freed { ...@@ -27,7 +27,7 @@ struct klockstat : public rcu_freed {
struct lockstat s; struct lockstat s;
klockstat(const char *name); klockstat(const char *name);
virtual ~klockstat() {} virtual void do_gc() { delete this; }
}; };
#else #else
struct klockstat; struct klockstat;
......
...@@ -26,7 +26,7 @@ class xelem : public rcu_freed { ...@@ -26,7 +26,7 @@ class xelem : public rcu_freed {
K key; K key;
xelem(const K &k, const V &v) : rcu_freed("xelem"), val(v), next_lock(0), next(0), key(k) {} xelem(const K &k, const V &v) : rcu_freed("xelem"), val(v), next_lock(0), next(0), key(k) {}
virtual ~xelem() {} virtual void do_gc() { delete this; }
}; };
template<class K, class V> template<class K, class V>
...@@ -55,6 +55,10 @@ class xns : public rcu_freed { ...@@ -55,6 +55,10 @@ class xns : public rcu_freed {
panic("~xns: not empty"); panic("~xns: not empty");
} }
virtual void do_gc() {
delete this;
}
u64 allockey() { u64 allockey() {
return __sync_fetch_and_add(&nextkey, 1); return __sync_fetch_and_add(&nextkey, 1);
} }
......
...@@ -185,8 +185,9 @@ class delayedfree : public rcu_freed { ...@@ -185,8 +185,9 @@ class delayedfree : public rcu_freed {
public: public:
delayedfree(proc *p) : rcu_freed("delayed proc free"), _p(p) {} delayedfree(proc *p) : rcu_freed("delayed proc free"), _p(p) {}
virtual ~delayedfree() { virtual void do_gc() {
kmfree(_p); kmfree(_p);
delete this;
} }
}; };
......
//#define TREE #define TREE
#include "gc.hh" #include "gc.hh"
...@@ -18,7 +18,9 @@ struct vma : public rcu_freed { ...@@ -18,7 +18,9 @@ struct vma : public rcu_freed {
initlock(&lock, lockname, LOCKSTAT_VM); initlock(&lock, lockname, LOCKSTAT_VM);
} }
virtual ~vma(); ~vma();
virtual void do_gc() { delete this; }
}; };
// A memory object (physical pages or inode). // A memory object (physical pages or inode).
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论