17 #ifndef INC_KY_Kernel_MemoryHeap_H
18 #define INC_KY_Kernel_MemoryHeap_H
33 StatHeap_Summary = StatHeap_Start,
34 StatHeap_TotalFootprint,
35 StatHeap_LocalFootprint,
36 StatHeap_ChildFootprint,
38 StatHeap_LocalUsedSpace,
39 StatHeap_SysDirectSpace,
44 StatHeap_DynamicGranularity,
49 namespace HeapMH {
class RootMH; }
50 namespace Heap {
class MemVisitor;
class SegVisitor; }
82 class MemoryHeap :
public ListNode<MemoryHeap>
84 friend class MemoryHeapMH;
88 Heap_ThreadUnsafe = 0x0001,
96 Heap_FastTinyBlocks = 0x0002,
102 Heap_FixedGranularity = 0x0004,
109 Heap_NoDebugInfo = 0x0010,
115 Heap_UserDebug = 0x1000
118 enum RootHeapParameters
120 RootHeap_MinAlign = 16,
121 RootHeap_Granularity = 16*1024,
122 RootHeap_Reserve = 16*1024,
123 RootHeap_Threshold = 256*1024,
173 HeapDesc(
unsigned flags = 0,
175 UPInt granularity = 8*1024,
176 UPInt reserve = 8*1024,
177 UPInt threshold=~UPInt(0),
181 : Flags(flags), MinAlign(minAlign),
182 Granularity(granularity), Reserve(reserve),
183 Threshold(threshold), Limit(limit),
184 HeapId(heapId), Arena(arena)
193 Threshold = ~UPInt(0);
203 struct RootHeapDesc :
public HeapDesc
206 : HeapDesc(0, RootHeap_MinAlign,
207 RootHeap_Granularity, RootHeap_Reserve,
208 RootHeap_Threshold, RootHeap_Limit, HeapId_Global)
227 virtual ~HeapVisitor() { }
234 virtual void Visit(MemoryHeap* parentHeap, MemoryHeap *childHeap) = 0;
240 virtual ~LimitHandler() {}
249 virtual bool OnExceedLimit(MemoryHeap* heap, UPInt overLimit) = 0;
253 virtual void OnFreeSegment(MemoryHeap* heap, UPInt freeingSize) = 0;
259 virtual ~HeapTracer() {}
260 virtual void OnCreateHeap(
const MemoryHeap* heap) = 0;
261 virtual void OnDestroyHeap(
const MemoryHeap* heap) = 0;
262 virtual void OnAlloc(
const MemoryHeap* heap, UPInt size, UPInt align,
unsigned sid,
const void* ptr) = 0;
263 virtual void OnRealloc(
const MemoryHeap* heap,
const void* oldPtr, UPInt newSize,
const void* newPtr) = 0;
264 virtual void OnFree(
const MemoryHeap* heap,
const void* ptr) = 0;
270 UPInt SysMemFootprint;
271 UPInt SysMemUsedSpace;
272 UPInt PageMapFootprint;
273 UPInt PageMapUsedSpace;
274 UPInt BookkeepingFootprint;
275 UPInt BookkeepingUsedSpace;
276 UPInt DebugInfoFootprint;
277 UPInt DebugInfoUsedSpace;
278 UPInt UserDebugFootprint;
279 UPInt UserDebugUsedSpace;
284 virtual ~MemoryHeap() {}
291 static void InitMH(SysAlloc* sysAllocMH);
292 static void CleanUpMH();
296 static MemoryHeap* CreateRootHeapMH();
297 static MemoryHeap* CreateRootHeapMH(
const HeapDesc& desc);
303 static void ReleaseRootHeapMH();
309 virtual void DestroyArena(UPInt arena) = 0;
310 virtual bool ArenaIsEmpty(UPInt arena) = 0;
319 virtual MemoryHeap* CreateHeap(
const char* name,
320 const HeapDesc& desc) = 0;
322 MemoryHeap* CreateHeap(
const char* name,
325 UPInt granularity = 16*1024,
326 UPInt reserve = 16*1024,
327 UPInt threshold=~UPInt(0),
332 HeapDesc desc(flags, minAlign, granularity, reserve, threshold, limit, heapId, arena);
333 return CreateHeap(name, desc);
340 void GetHeapInfo(HeapInfo* infoPtr)
const;
342 const char* GetName()
const {
return Info.pName; }
343 UPInt GetId()
const {
return Info.Desc.HeapId;}
344 MemoryHeap* GetParentHeap()
const {
return Info.pParent; }
345 unsigned GetFlags()
const {
return Info.Desc.Flags; }
346 UPInt GetGranularity()
const {
return Info.Desc.Granularity; }
348 virtual void SetLimitHandler(LimitHandler* handler) = 0;
349 virtual void SetLimit(UPInt newLimit) = 0;
350 UPInt GetLimit()
const {
return Info.Desc.Limit; }
354 inline bool IsThreadSafe()
const
356 return (Info.Desc.Flags & Heap_ThreadUnsafe) == 0;
364 virtual void AddRef() = 0;
371 virtual void Release() = 0;
376 void ReleaseOnFree(
void *ptr);
379 void AssignToCurrentThread();
383 virtual void* Alloc(UPInt size,
const AllocInfo* info = 0) = 0;
384 virtual void* Alloc(UPInt size, UPInt align,
const AllocInfo* info = 0) = 0;
388 virtual void* Realloc(
void* oldPtr, UPInt newSize) = 0;
389 virtual void* ReallocAutoHeap(
void* oldPtr, UPInt newSize) {
return Realloc(oldPtr, newSize); }
391 virtual void Free(
void* ptr) = 0;
395 virtual void* AllocAutoHeap(
const void *thisPtr, UPInt size,
396 const AllocInfo* info = 0) = 0;
399 virtual void* AllocAutoHeap(
const void *thisPtr, UPInt size, UPInt align,
400 const AllocInfo* info = 0) = 0;
405 virtual MemoryHeap* GetAllocHeap(
const void *thisPtr) = 0;
408 virtual UPInt GetUsableSize(
const void* ptr) = 0;
416 virtual void* AllocSysDirect(UPInt size) = 0;
417 virtual void FreeSysDirect(
void* ptr, UPInt size) = 0;
426 virtual UPInt GetFootprint()
const = 0;
427 virtual UPInt GetTotalFootprint()
const = 0;
428 virtual UPInt GetUsedSpace()
const = 0;
429 virtual UPInt GetTotalUsedSpace()
const = 0;
430 virtual void GetRootStats(RootStats* stats) = 0;
435 virtual void VisitMem(Heap::MemVisitor* visitor,
unsigned flags) = 0;
437 virtual void VisitRootSegments(Heap::SegVisitor* visitor) = 0;
438 virtual void VisitHeapSegments(Heap::SegVisitor* visitor)
const = 0;
440 virtual void SetTracer(HeapTracer* tracer) = 0;
445 bool DumpMemoryLeaks();
447 void UltimateCheck();
450 void VisitChildHeaps(HeapVisitor* visitor);
451 void LockAndVisit(HeapVisitor* visitor);
452 void CheckIntegrity();
458 void ReleaseCachedMem();
461 virtual void destroyItself() = 0;
462 virtual void ultimateCheck() = 0;
463 virtual void releaseCachedMem() = 0;
464 virtual bool dumpMemoryLeaks() = 0;
465 virtual void checkIntegrity()
const = 0;
466 virtual void getUserDebugStats(RootStats* stats)
const = 0;
468 typedef List<MemoryHeap> ChildListType;
471 volatile unsigned RefCount;
479 ChildListType ChildHeaps;
480 mutable Lock HeapLock;
The Autodesk Navigation namespace.
Definition: gamekitcrowddispersion.cpp:17