17 #ifndef INC_KY_Kernel_Memory_H
18 #define INC_KY_Kernel_Memory_H
26 #define KY_SYSALLOC_DEFAULT_CLASS Kaim::SysAllocMalloc
67 #if !defined(KY_MEMORY_ENABLE_DEBUG_INFO)
69 #define KY_ALLOC(s,id) Kaim::Memory::Alloc((s))
70 #define KY_MEMALIGN(s,a,id) Kaim::Memory::Alloc((s),(a))
71 #define KY_REALLOC(p,s,id) Kaim::Memory::Realloc((p),(s))
72 #define KY_FREE(p) Kaim::Memory::Free((p))
73 #define KY_FREE_ALIGN(s) Kaim::Memory::Free((s))
75 #define KY_HEAP_ALLOC(heap,s,id) Kaim::Memory::AllocInHeap((heap),(s))
76 #define KY_HEAP_MEMALIGN(heap,s,a,id) Kaim::Memory::AllocInHeap((heap),(s),(a))
77 #define KY_HEAP_REALLOC(heap,p,s,id) Kaim::Memory::ReallocInHeap((heap),(p),(s))
78 #define KY_HEAP_AUTO_ALLOC(addr,s) Kaim::Memory::AllocAutoHeap((addr),(s))
79 #define KY_HEAP_AUTO_ALLOC_ID(addr,s,id) Kaim::Memory::AllocAutoHeap((addr),(s))
80 #define KY_HEAP_FREE(heap, p) Kaim::Memory::Free((p))
82 #else // KY_MEMORY_ENABLE_DEBUG_INFO
83 #define KY_ALLOC(s,id) Kaim::Memory::Alloc((s), Kaim::AllocInfo((id),__FILE__,__LINE__))
84 #define KY_MEMALIGN(s,a,id) Kaim::Memory::Alloc((s),(a), Kaim::AllocInfo((id),__FILE__,__LINE__))
85 #define KY_REALLOC(p,s,id) Kaim::Memory::Realloc((p),(s),Kaim::AllocInfo((id),__FILE__,__LINE__))
86 #define KY_FREE(p) Kaim::Memory::Free((p))
87 #define KY_FREE_ALIGN(s) Kaim::Memory::Free((s))
89 #define KY_HEAP_ALLOC(heap,s,id) Kaim::Memory::AllocInHeap((heap),(s), Kaim::AllocInfo((id),__FILE__,__LINE__))
90 #define KY_HEAP_MEMALIGN(heap,s,a,id) Kaim::Memory::AllocInHeap((heap),(s),(a), Kaim::AllocInfo((id),__FILE__,__LINE__))
91 #define KY_HEAP_REALLOC(heap,p,s,id) Kaim::Memory::ReallocInHeap((heap),(p),(s))
92 #define KY_HEAP_AUTO_ALLOC(addr,s) Kaim::Memory::AllocAutoHeap((addr),(s), Kaim::AllocInfo(Kaim::Stat_Default_Mem,__FILE__,__LINE__))
93 #define KY_HEAP_AUTO_ALLOC_ID(addr,s,id) Kaim::Memory::AllocAutoHeap((addr),(s), Kaim::AllocInfo((id),__FILE__,__LINE__))
94 #define KY_HEAP_FREE(heap, p) Kaim::Memory::Free((p))
96 #endif // !defined(KY_MEMORY_ENABLE_DEBUG_INFO)
98 #ifdef KY_ENABLE_STACK_REGISTRY
99 KY_INLINE
void* RegisterStack(
void* p, Kaim::UPInt size) { Kaim::StackRegistry::MapCurrentStackToUid(Kaim::UPInt(p), size);
return p; }
100 #define KY_REGISTER_STACK(p, s) RegisterStack(p, s);
101 #define KY_UNREGISTER_STACK(p) Kaim::StackRegistry::UnMapStackFromUid((Kaim::UPInt)p)
103 #define KY_REGISTER_STACK(p, s) p
104 #define KY_UNREGISTER_STACK(p)
119 static MemoryHeap *pGlobalHeap;
123 static void KY_STDCALL SetGlobalHeap(MemoryHeap *heap) { pGlobalHeap = heap; }
124 static MemoryHeap* KY_STDCALL GetGlobalHeap() {
return pGlobalHeap; }
128 static void KY_STDCALL CreateArena(UPInt arena, SysAllocPaged* sysAlloc) { pGlobalHeap->CreateArena(arena, sysAlloc); }
129 static void KY_STDCALL DestroyArena(UPInt arena) { pGlobalHeap->DestroyArena(arena); }
130 static bool KY_STDCALL ArenaIsEmpty(UPInt arena) {
return pGlobalHeap->ArenaIsEmpty(arena); }
135 static void* KY_STDCALL Alloc(UPInt size) {
return KY_REGISTER_STACK(pGlobalHeap->Alloc(size), size); }
136 static void* KY_STDCALL Alloc(UPInt size, UPInt align) {
return KY_REGISTER_STACK(pGlobalHeap->Alloc(size, align), size); }
137 static void* KY_STDCALL Alloc(UPInt size,
const AllocInfo& info) {
return KY_REGISTER_STACK(pGlobalHeap->Alloc(size, &info), size); }
138 static void* KY_STDCALL Alloc(UPInt size, UPInt align,
const AllocInfo& info) {
return KY_REGISTER_STACK(pGlobalHeap->Alloc(size, align, &info), size); }
141 static void* KY_STDCALL AllocAutoHeap(
const void *p, UPInt size) {
return KY_REGISTER_STACK(pGlobalHeap->AllocAutoHeap(p, size), size); }
142 static void* KY_STDCALL AllocAutoHeap(
const void *p, UPInt size, UPInt align) {
return KY_REGISTER_STACK(pGlobalHeap->AllocAutoHeap(p, size, align), size); }
143 static void* KY_STDCALL AllocAutoHeap(
const void *p, UPInt size,
const AllocInfo& info) {
return KY_REGISTER_STACK(pGlobalHeap->AllocAutoHeap(p, size, &info), size); }
144 static void* KY_STDCALL AllocAutoHeap(
const void *p, UPInt size, UPInt align,
const AllocInfo& info) {
return KY_REGISTER_STACK(pGlobalHeap->AllocAutoHeap(p, size, align, &info), size); }
148 static void* KY_STDCALL AllocInHeap(MemoryHeap* heap, UPInt size) {
return KY_REGISTER_STACK(heap->Alloc(size), size); }
149 static void* KY_STDCALL AllocInHeap(MemoryHeap* heap, UPInt size, UPInt align) {
return KY_REGISTER_STACK(heap->Alloc(size, align), size); }
150 static void* KY_STDCALL AllocInHeap(MemoryHeap* heap, UPInt size,
const AllocInfo& info) {
return KY_REGISTER_STACK(heap->Alloc(size, &info), size); }
151 static void* KY_STDCALL AllocInHeap(MemoryHeap* heap, UPInt size, UPInt align,
const AllocInfo& info) {
return KY_REGISTER_STACK(heap->Alloc(size, align, &info), size); }
159 static void* KY_STDCALL Realloc(
void *p, UPInt newSize) { KY_UNREGISTER_STACK(p);
return KY_REGISTER_STACK(pGlobalHeap->Realloc(p, newSize), newSize); }
160 static void* KY_STDCALL ReallocAutoHeap(
void *p, UPInt newSize) { KY_UNREGISTER_STACK(p);
return KY_REGISTER_STACK(pGlobalHeap->ReallocAutoHeap(p, newSize), newSize); }
161 static void* KY_STDCALL ReallocInHeap(MemoryHeap* heap,
void *p, UPInt newSize) { KY_UNREGISTER_STACK(p);
return KY_REGISTER_STACK(heap->Realloc(p, newSize), newSize); }
164 static void KY_STDCALL Free(
void *p) { KY_UNREGISTER_STACK(p); pGlobalHeap->Free(p); }
166 static MemoryHeap* KY_STDCALL GetHeapByAddress(
const void* p) {
return pGlobalHeap->GetAllocHeap(p); }
167 static bool KY_STDCALL DetectMemoryLeaks() {
return pGlobalHeap->DumpMemoryLeaks(); }
175 struct MemAddressStub { };
176 typedef MemAddressStub* MemAddressPtr;
178 #define KY_MEMORY_REDEFINE_NEW_IMPL(class_name, check_delete, StatType) \
179 void* operator new(Kaim::UPInt sz) \
180 { void *p = KY_ALLOC(sz, StatType); return p; } \
181 void* operator new(Kaim::UPInt sz, Kaim::MemoryHeap* heap) \
182 { void *p = KY_HEAP_ALLOC(heap, sz, StatType); return p; } \
183 void* operator new(Kaim::UPInt sz, Kaim::MemoryHeap* heap, int blocktype) \
184 { KY_UNUSED(blocktype); void *p = KY_HEAP_ALLOC(heap, sz, blocktype); return p; } \
185 void* operator new(Kaim::UPInt sz, Kaim::MemAddressPtr adr) \
186 { void *p = Kaim::Memory::AllocAutoHeap(adr, sz, Kaim::AllocInfo(StatType,__FILE__,__LINE__)); return p; } \
187 void* operator new(Kaim::UPInt sz, const char* pfilename, int line) \
188 { void* p = Kaim::Memory::Alloc(sz, Kaim::AllocInfo(StatType, pfilename, line)); return p; } \
189 void* operator new(Kaim::UPInt sz, Kaim::MemoryHeap* heap, const char* pfilename, int line) \
190 { void* p = Kaim::Memory::AllocInHeap(heap, sz, Kaim::AllocInfo(StatType, pfilename, line)); return p; } \
191 void* operator new(Kaim::UPInt sz, Kaim::MemAddressPtr adr, const char* pfilename, int line) \
192 { void* p = Kaim::Memory::AllocAutoHeap(adr, sz, Kaim::AllocInfo(StatType, pfilename, line)); return p; } \
193 void* operator new(Kaim::UPInt sz, int blocktype, const char* pfilename, int line) \
194 { void* p = Kaim::Memory::Alloc(sz, Kaim::AllocInfo(blocktype, pfilename, line)); return p; } \
195 void* operator new(Kaim::UPInt sz, Kaim::MemoryHeap* heap, int blocktype, const char* pfilename, int line) \
196 { void* p = Kaim::Memory::AllocInHeap(heap, sz, Kaim::AllocInfo(blocktype, pfilename, line)); return p; } \
197 void* operator new(Kaim::UPInt sz, Kaim::MemAddressPtr adr, int blocktype, const char* pfilename, int line) \
198 { void* p = Kaim::Memory::AllocAutoHeap(adr, sz, Kaim::AllocInfo(blocktype, pfilename, line)); return p; } \
199 void operator delete(void *p) \
200 { check_delete(class_name, p); KY_FREE(p); } \
201 void operator delete(void *p, const char*, int) \
202 { check_delete(class_name, p); KY_FREE(p); } \
203 void operator delete(void *p, int, const char*, int) \
204 { check_delete(class_name, p); KY_FREE(p); } \
205 void operator delete(void *p, Kaim::MemoryHeap*) \
206 { check_delete(class_name, p); KY_FREE(p); } \
207 void operator delete(void *p, Kaim::MemoryHeap*, int) \
208 { check_delete(class_name, p); KY_FREE(p); } \
209 void operator delete(void *p, Kaim::MemoryHeap*, const char*, int) \
210 { check_delete(class_name, p); KY_FREE(p); } \
211 void operator delete(void *p, Kaim::MemoryHeap*, int,const char*,int) \
212 { check_delete(class_name, p); KY_FREE(p); } \
213 void operator delete(void *p, Kaim::MemAddressPtr) \
214 { check_delete(class_name, p); KY_FREE(p); } \
215 void operator delete(void *p, Kaim::MemAddressPtr, int) \
216 { check_delete(class_name, p); KY_FREE(p); } \
217 void operator delete(void *p, Kaim::MemAddressPtr, const char*, int) \
218 { check_delete(class_name, p); KY_FREE(p); } \
219 void operator delete(void *p, Kaim::MemAddressPtr,int,const char*,int) \
220 { check_delete(class_name, p); KY_FREE(p); }
222 #define KY_MEMORY_DEFINE_PLACEMENT_NEW \
223 void* operator new (Kaim::UPInt n, void *ptr) { KY_UNUSED(n); return ptr; } \
224 void operator delete (void *ptr, void *ptr2) { KY_UNUSED2(ptr,ptr2); }
227 #define KY_MEMORY_CHECK_DELETE_NONE(class_name, p)
230 #define KY_MEMORY_REDEFINE_NEW(class_name, StatType) KY_MEMORY_REDEFINE_NEW_IMPL(class_name, KY_MEMORY_CHECK_DELETE_NONE, StatType)
235 class NewOverrideBase
238 enum { StatType = Stat };
241 KY_MEMORY_REDEFINE_NEW(NewOverrideBase, Stat)
252 #if defined(KY_BUILD_DEFINE_NEW) && !defined(KY_DEFINE_NEW)
253 #define KY_DEFINE_NEW new(__FILE__,__LINE__)
256 #if defined(KY_DEFINE_NEW)
257 #define new KY_DEFINE_NEW
261 #endif // INC_GMEMORY_H
Definition: gamekitcrowddispersion.h:20