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

macro for fixed-size operator new and delete

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