提交 1c77c3b0 创建 作者: Nickolai Zeldovich's avatar Nickolai Zeldovich

macro for fixed-size operator new and delete

上级 958c2e7f
#include "gc.hh" #include "gc.hh"
#include "atomic.hh" #include "atomic.hh"
#include "cpputil.hh"
using std::atomic; using std::atomic;
...@@ -17,15 +18,7 @@ struct buf : public rcu_freed { ...@@ -17,15 +18,7 @@ struct buf : public rcu_freed {
buf() : rcu_freed("buf") {} buf() : rcu_freed("buf") {}
virtual void do_gc() { delete this; } virtual void do_gc() { delete this; }
NEW_DELETE_OPS(buf)
static void* operator new(unsigned long nbytes) {
assert(nbytes == sizeof(buf));
return kmalloc(sizeof(buf));
}
static void operator delete(void *p) {
return kmfree(p, sizeof(buf));
}
}; };
#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
......
...@@ -67,8 +67,20 @@ namespace std { ...@@ -67,8 +67,20 @@ namespace std {
} }
/* C++ runtime */ /* C++ runtime */
void *operator new(unsigned long nbytes); // void *operator new(unsigned long nbytes);
void *operator new(unsigned long nbytes, void *buf); // void *operator new(unsigned long nbytes, void *buf);
void operator delete(void *p); void *operator new[](unsigned long nbytes);
// void operator delete(void *p);
void operator delete[](void *p);
extern "C" void __cxa_pure_virtual(void); extern "C" void __cxa_pure_virtual(void);
#define NEW_DELETE_OPS(classname) \
static void* operator new(unsigned long nbytes) { \
assert(nbytes == sizeof(classname)); \
return kmalloc(sizeof(classname)); \
} \
\
static void operator delete(void *p) { \
return kmfree(p, sizeof(classname)); \
}
#pragma once
#include "mmu.h" #include "mmu.h"
#include "atomic.hh" #include "atomic.hh"
......
...@@ -110,14 +110,7 @@ struct range_head : public range { ...@@ -110,14 +110,7 @@ struct range_head : public range {
range_head(crange *cr, u64 k, u64 sz, int nlevel) range_head(crange *cr, u64 k, u64 sz, int nlevel)
: range(cr, k, sz, nlevel) {} : range(cr, k, sz, nlevel) {}
static void* operator new(unsigned long nbytes) { NEW_DELETE_OPS(range_head)
assert(nbytes == sizeof(range_head));
return kmalloc(sizeof(range_head));
}
static void operator delete(void *p) {
return kmfree(p, sizeof(range_head));
}
virtual void do_gc() { virtual void do_gc() {
delete this; delete this;
...@@ -165,15 +158,7 @@ struct crange { ...@@ -165,15 +158,7 @@ struct crange {
range_iterator begin() const { return range_iterator(crange_head->next[0].ptr()); }; range_iterator begin() const { return range_iterator(crange_head->next[0].ptr()); };
range_iterator end() const { return range_iterator(0); }; range_iterator end() const { return range_iterator(0); };
NEW_DELETE_OPS(crange)
static void* operator new(unsigned long nbytes) {
assert(nbytes == sizeof(crange));
return kmalloc(sizeof(crange));
}
static void operator delete(void *p) {
return kmfree(p, sizeof(crange));
}
}; };
static inline range_iterator static inline range_iterator
......
...@@ -6,3 +6,4 @@ ...@@ -6,3 +6,4 @@
#include "atomic.hh" #include "atomic.hh"
#include "proc.hh" #include "proc.hh"
#include "cpu.hh" #include "cpu.hh"
#include "cpputil.hh"
...@@ -42,15 +42,7 @@ struct inode : public rcu_freed { ...@@ -42,15 +42,7 @@ struct inode : public rcu_freed {
inode(); inode();
~inode(); ~inode();
virtual void do_gc() { delete this; } virtual void do_gc() { delete this; }
NEW_DELETE_OPS(inode)
static void* operator new(unsigned long nbytes) {
assert(nbytes == sizeof(inode));
return kmalloc(sizeof(inode));
}
static void operator delete(void *p) {
return kmfree(p, sizeof(inode));
}
}; };
#define I_BUSYR 0x1 #define I_BUSYR 0x1
......
...@@ -24,14 +24,7 @@ class xelem : public rcu_freed { ...@@ -24,14 +24,7 @@ class xelem : public rcu_freed {
delete this; delete this;
} }
static void* operator new(unsigned long nbytes) { NEW_DELETE_OPS(xelem)
assert(nbytes == sizeof(xelem));
return kmalloc(sizeof(xelem));
}
static void operator delete(void *p) {
kmfree(p, sizeof(xelem));
}
}; };
template<class K, class V> template<class K, class V>
...@@ -227,14 +220,7 @@ class xns : public rcu_freed { ...@@ -227,14 +220,7 @@ class xns : public rcu_freed {
return iterator(); return iterator();
} }
static void* operator new(unsigned long nbytes) { NEW_DELETE_OPS(xns)
assert(nbytes == sizeof(xns));
return kmalloc(sizeof(xns));
}
static void operator delete(void *p) {
return kmfree(p, sizeof(xns));
}
}; };
template<class K, class V, u64 (*HF)(const K&)> template<class K, class V, u64 (*HF)(const K&)>
......
#pragma once
#include "spinlock.h" #include "spinlock.h"
#include "atomic.hh" #include "atomic.hh"
......
#include "gc.hh" #include "gc.hh"
#include "atomic.hh" #include "atomic.hh"
#include "crange_arch.hh"
#include "crange.hh" #include "crange.hh"
#include "cpputil.hh" #include "cpputil.hh"
#include "hwvm.hh" #include "hwvm.hh"
...@@ -26,15 +27,7 @@ struct vmnode { ...@@ -26,15 +27,7 @@ struct vmnode {
vmnode* copy(); vmnode* copy();
int demand_load(); int demand_load();
NEW_DELETE_OPS(vmnode)
static void* operator new(unsigned long nbytes) {
assert(nbytes == sizeof(vmnode));
return kmalloc(sizeof(vmnode));
}
static void operator delete(void *p) {
return kmfree(p, sizeof(vmnode));
}
}; };
// A mapping of a chunk of an address space to // A mapping of a chunk of an address space to
...@@ -51,15 +44,7 @@ struct vma : public range { ...@@ -51,15 +44,7 @@ struct vma : public range {
~vma(); ~vma();
virtual void do_gc() { delete this; } virtual void do_gc() { delete this; }
NEW_DELETE_OPS(vma)
static void* operator new(unsigned long nbytes) {
assert(nbytes == sizeof(vma));
return kmalloc(sizeof(vma));
}
static void operator delete(void *p) {
return kmfree(p, sizeof(vma));
}
}; };
// An address space: a set of vmas plus h/w page table. // An address space: a set of vmas plus h/w page table.
...@@ -83,15 +68,7 @@ struct vmap { ...@@ -83,15 +68,7 @@ struct vmap {
int pagefault(uptr va, u32 err); int pagefault(uptr va, u32 err);
int copyout(uptr va, void *p, u64 len); int copyout(uptr va, void *p, u64 len);
NEW_DELETE_OPS(vmap)
static void* operator new(unsigned long nbytes) {
assert(nbytes == sizeof(vmap));
return kmalloc(sizeof(vmap));
}
static void operator delete(void *p) {
return kmfree(p, sizeof(vmap));
}
private: private:
int pagefault_wcow(vma *m); int pagefault_wcow(vma *m);
......
...@@ -485,14 +485,7 @@ class diskblock : public rcu_freed { ...@@ -485,14 +485,7 @@ class diskblock : public rcu_freed {
delete this; delete this;
} }
static void* operator new(unsigned long nbytes) { NEW_DELETE_OPS(diskblock)
assert(nbytes == sizeof(diskblock));
return kmalloc(sizeof(diskblock));
}
static void operator delete(void *p) {
return kmfree(p, sizeof(diskblock));
}
}; };
static void static void
......
...@@ -188,14 +188,7 @@ class delayed_proc_free : public rcu_freed { ...@@ -188,14 +188,7 @@ class delayed_proc_free : public rcu_freed {
delete this; delete this;
} }
static void* operator new(unsigned long nbytes) { NEW_DELETE_OPS(delayed_proc_free)
assert(nbytes == sizeof(delayed_proc_free));
return kmalloc(sizeof(delayed_proc_free));
}
static void operator delete(void *p) {
return kmfree(p, sizeof(delayed_proc_free));
}
}; };
static void static void
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论