27 #if !defined(KY_MEMORY_ENABLE_DEBUG_INFO)
29 #define KY_ALLOC(s,id) Kaim::Memory::Alloc((s))
30 #define KY_MEMALIGN(s,a,id) Kaim::Memory::Alloc((s),(a))
31 #define KY_REALLOC(p,s,id) Kaim::Memory::Realloc((p),(s))
32 #define KY_FREE(p) Kaim::Memory::Free((p))
33 #define KY_FREE_ALIGN(s) Kaim::Memory::Free((s))
35 #define KY_HEAP_ALLOC(heap,s,id) Kaim::Memory::AllocInHeap((heap),(s))
36 #define KY_HEAP_MEMALIGN(heap,s,a,id) Kaim::Memory::AllocInHeap((heap),(s),(a))
37 #define KY_HEAP_REALLOC(heap,p,s,id) Kaim::Memory::ReallocInHeap((heap),(p),(s))
38 #define KY_HEAP_AUTO_ALLOC(addr,s) Kaim::Memory::AllocAutoHeap((addr),(s))
39 #define KY_HEAP_AUTO_ALLOC_ID(addr,s,id) Kaim::Memory::AllocAutoHeap((addr),(s))
40 #define KY_HEAP_FREE(heap, p) Kaim::Memory::Free((p))
42 #else // KY_MEMORY_ENABLE_DEBUG_INFO
43 #define KY_ALLOC(s,id) Kaim::Memory::Alloc((s), Kaim::AllocInfo((id),__FILE__,__LINE__))
44 #define KY_MEMALIGN(s,a,id) Kaim::Memory::Alloc((s),(a), Kaim::AllocInfo((id),__FILE__,__LINE__))
45 #define KY_REALLOC(p,s,id) Kaim::Memory::Realloc((p),(s),Kaim::AllocInfo((id),__FILE__,__LINE__))
46 #define KY_FREE(p) Kaim::Memory::Free((p))
47 #define KY_FREE_ALIGN(s) Kaim::Memory::Free((s))
49 #define KY_HEAP_ALLOC(heap,s,id) Kaim::Memory::AllocInHeap((heap),(s), Kaim::AllocInfo((id),__FILE__,__LINE__))
50 #define KY_HEAP_MEMALIGN(heap,s,a,id) Kaim::Memory::AllocInHeap((heap),(s),(a), Kaim::AllocInfo((id),__FILE__,__LINE__))
51 #define KY_HEAP_REALLOC(heap,p,s,id) Kaim::Memory::ReallocInHeap((heap),(p),(s))
52 #define KY_HEAP_AUTO_ALLOC(addr,s) Kaim::Memory::AllocAutoHeap((addr),(s), Kaim::AllocInfo(Kaim::Stat_Default_Mem,__FILE__,__LINE__))
53 #define KY_HEAP_AUTO_ALLOC_ID(addr,s,id) Kaim::Memory::AllocAutoHeap((addr),(s), Kaim::AllocInfo((id),__FILE__,__LINE__))
54 #define KY_HEAP_FREE(heap, p) Kaim::Memory::Free((p))
56 #endif // !defined(KY_MEMORY_ENABLE_DEBUG_INFO)
59 #if defined(KY_ENABLE_STACK_REGISTRY)
60 KY_INLINE
void* RegisterStack(
void* p, Kaim::UPInt size) { Kaim::StackRegistry::MapCurrentStackToUid(Kaim::UPInt(p), size);
return p; }
61 #define KY_REGISTER_STACK(p, s) RegisterStack(p, s);
62 #define KY_UNREGISTER_STACK(p) Kaim::StackRegistry::UnMapStackFromUid((Kaim::UPInt)p)
64 #define KY_REGISTER_STACK(p, s) p
65 #define KY_UNREGISTER_STACK(p)
79 static MemoryHeap *pGlobalHeap;
82 static void SetGlobalHeap(MemoryHeap *heap) { pGlobalHeap = heap; }
83 static MemoryHeap* GetGlobalHeap() {
return pGlobalHeap; }
87 static void DestroyArena(UPInt arena) { pGlobalHeap->DestroyArena(arena); }
88 static bool ArenaIsEmpty(UPInt arena) {
return pGlobalHeap->ArenaIsEmpty(arena); }
93 static void* Alloc(UPInt size) {
return KY_REGISTER_STACK(pGlobalHeap->Alloc(size), size); }
94 static void* Alloc(UPInt size, UPInt align) {
return KY_REGISTER_STACK(pGlobalHeap->Alloc(size, align), size); }
95 static void* Alloc(UPInt size,
const AllocInfo& info) {
return KY_REGISTER_STACK(pGlobalHeap->Alloc(size, &info), size); }
96 static void* Alloc(UPInt size, UPInt align,
const AllocInfo& info) {
return KY_REGISTER_STACK(pGlobalHeap->Alloc(size, align, &info), size); }
99 static void* AllocAutoHeap(
const void *p, UPInt size) {
return KY_REGISTER_STACK(pGlobalHeap->AllocAutoHeap(p, size), size); }
100 static void* AllocAutoHeap(
const void *p, UPInt size, UPInt align) {
return KY_REGISTER_STACK(pGlobalHeap->AllocAutoHeap(p, size, align), size); }
101 static void* AllocAutoHeap(
const void *p, UPInt size,
const AllocInfo& info) {
return KY_REGISTER_STACK(pGlobalHeap->AllocAutoHeap(p, size, &info), size); }
102 static void* AllocAutoHeap(
const void *p, UPInt size, UPInt align,
const AllocInfo& info) {
return KY_REGISTER_STACK(pGlobalHeap->AllocAutoHeap(p, size, align, &info), size); }
106 static void* AllocInHeap(MemoryHeap* heap, UPInt size) {
return KY_REGISTER_STACK(heap->Alloc(size), size); }
107 static void* AllocInHeap(MemoryHeap* heap, UPInt size, UPInt align) {
return KY_REGISTER_STACK(heap->Alloc(size, align), size); }
108 static void* AllocInHeap(MemoryHeap* heap, UPInt size,
const AllocInfo& info) {
return KY_REGISTER_STACK(heap->Alloc(size, &info), size); }
109 static void* AllocInHeap(MemoryHeap* heap, UPInt size, UPInt align,
const AllocInfo& info) {
return KY_REGISTER_STACK(heap->Alloc(size, align, &info), size); }
117 static void* Realloc(
void *p, UPInt newSize) { KY_UNREGISTER_STACK(p);
return KY_REGISTER_STACK(pGlobalHeap->Realloc(p, newSize), newSize); }
118 static void* ReallocAutoHeap(
void *p, UPInt newSize) { KY_UNREGISTER_STACK(p);
return KY_REGISTER_STACK(pGlobalHeap->ReallocAutoHeap(p, newSize), newSize); }
119 static void* ReallocInHeap(MemoryHeap* heap,
void *p, UPInt newSize) { KY_UNREGISTER_STACK(p);
return KY_REGISTER_STACK(heap->Realloc(p, newSize), newSize); }
122 static void Free(
void *p) { KY_UNREGISTER_STACK(p); pGlobalHeap->Free(p); }
124 static MemoryHeap* GetHeapByAddress(
const void* p) {
return pGlobalHeap->GetAllocHeap(p); }
125 static bool DetectMemoryLeaks() {
return pGlobalHeap->DumpMemoryLeaks(); }
133 struct MemAddressStub { };
134 typedef MemAddressStub* MemAddressPtr;
136 #define KY_MEMORY_REDEFINE_NEW_IMPL(class_name, check_delete, StatType) \
137 void* operator new(Kaim::UPInt sz) \
138 { void *p = KY_ALLOC(sz, StatType); return p; } \
139 void* operator new(Kaim::UPInt sz, Kaim::MemoryHeap* heap) \
140 { void *p = KY_HEAP_ALLOC(heap, sz, StatType); return p; } \
141 void* operator new(Kaim::UPInt sz, Kaim::MemoryHeap* heap, int blocktype) \
142 { KY_UNUSED(blocktype); void *p = KY_HEAP_ALLOC(heap, sz, blocktype); return p; } \
143 void* operator new(Kaim::UPInt sz, Kaim::MemAddressPtr adr) \
144 { void *p = Kaim::Memory::AllocAutoHeap(adr, sz, Kaim::AllocInfo(StatType,__FILE__,__LINE__)); return p; } \
145 void* operator new(Kaim::UPInt sz, const char* pfilename, int line) \
146 { void* p = Kaim::Memory::Alloc(sz, Kaim::AllocInfo(StatType, pfilename, line)); return p; } \
147 void* operator new(Kaim::UPInt sz, Kaim::MemoryHeap* heap, const char* pfilename, int line) \
148 { void* p = Kaim::Memory::AllocInHeap(heap, sz, Kaim::AllocInfo(StatType, pfilename, line)); return p; } \
149 void* operator new(Kaim::UPInt sz, Kaim::MemAddressPtr adr, const char* pfilename, int line) \
150 { void* p = Kaim::Memory::AllocAutoHeap(adr, sz, Kaim::AllocInfo(StatType, pfilename, line)); return p; } \
151 void* operator new(Kaim::UPInt sz, int blocktype, const char* pfilename, int line) \
152 { void* p = Kaim::Memory::Alloc(sz, Kaim::AllocInfo(blocktype, pfilename, line)); return p; } \
153 void* operator new(Kaim::UPInt sz, Kaim::MemoryHeap* heap, int blocktype, const char* pfilename, int line) \
154 { void* p = Kaim::Memory::AllocInHeap(heap, sz, Kaim::AllocInfo(blocktype, pfilename, line)); return p; } \
155 void* operator new(Kaim::UPInt sz, Kaim::MemAddressPtr adr, int blocktype, const char* pfilename, int line) \
156 { void* p = Kaim::Memory::AllocAutoHeap(adr, sz, Kaim::AllocInfo(blocktype, pfilename, line)); return p; } \
157 void operator delete(void *p) \
158 { check_delete(class_name, p); KY_FREE(p); } \
159 void operator delete(void *p, const char*, int) \
160 { check_delete(class_name, p); KY_FREE(p); } \
161 void operator delete(void *p, int, const char*, int) \
162 { check_delete(class_name, p); KY_FREE(p); } \
163 void operator delete(void *p, Kaim::MemoryHeap*) \
164 { check_delete(class_name, p); KY_FREE(p); } \
165 void operator delete(void *p, Kaim::MemoryHeap*, int) \
166 { check_delete(class_name, p); KY_FREE(p); } \
167 void operator delete(void *p, Kaim::MemoryHeap*, const char*, int) \
168 { check_delete(class_name, p); KY_FREE(p); } \
169 void operator delete(void *p, Kaim::MemoryHeap*, int,const char*,int) \
170 { check_delete(class_name, p); KY_FREE(p); } \
171 void operator delete(void *p, Kaim::MemAddressPtr) \
172 { check_delete(class_name, p); KY_FREE(p); } \
173 void operator delete(void *p, Kaim::MemAddressPtr, int) \
174 { check_delete(class_name, p); KY_FREE(p); } \
175 void operator delete(void *p, Kaim::MemAddressPtr, const char*, int) \
176 { check_delete(class_name, p); KY_FREE(p); } \
177 void operator delete(void *p, Kaim::MemAddressPtr,int,const char*,int) \
178 { check_delete(class_name, p); KY_FREE(p); }
180 #define KY_MEMORY_DEFINE_PLACEMENT_NEW \
181 void* operator new (Kaim::UPInt n, void *ptr) { KY_UNUSED(n); return ptr; } \
182 void operator delete (void *ptr, void *ptr2) { KY_UNUSED2(ptr,ptr2); }
185 #define KY_MEMORY_CHECK_DELETE_NONE(class_name, p)
188 #define KY_MEMORY_REDEFINE_NEW(class_name, StatType) KY_MEMORY_REDEFINE_NEW_IMPL(class_name, KY_MEMORY_CHECK_DELETE_NONE, StatType)
193 class NewOverrideBase
196 enum { StatType = Stat };
199 KY_MEMORY_REDEFINE_NEW(NewOverrideBase, Stat)
210 #if defined(KY_BUILD_DEFINE_NEW) && !defined(KY_DEFINE_NEW)
211 #define KY_DEFINE_NEW new(__FILE__,__LINE__)
214 #if defined(KY_DEFINE_NEW)
215 #define new KY_DEFINE_NEW
The Autodesk Navigation namespace.
Definition: gamekitcrowddispersion.cpp:17