17 #ifndef INC_KY_Kernel_MemoryHeap_H
18 #define INC_KY_Kernel_MemoryHeap_H
34 StatHeap_Summary = StatHeap_Start,
35 StatHeap_TotalFootprint,
36 StatHeap_LocalFootprint,
37 StatHeap_ChildFootprint,
39 StatHeap_LocalUsedSpace,
40 StatHeap_SysDirectSpace,
45 StatHeap_DynamicGranularity,
50 namespace HeapPT {
class HeapRoot; }
51 namespace HeapMH {
class RootMH; }
52 namespace Heap {
class MemVisitor;
class SegVisitor; }
84 class MemoryHeap :
public ListNode<MemoryHeap>
86 friend class MemoryHeapPT;
87 friend class MemoryHeapMH;
99 Heap_ThreadUnsafe = 0x0001,
107 Heap_FastTinyBlocks = 0x0002,
113 Heap_FixedGranularity = 0x0004,
120 Heap_NoDebugInfo = 0x0010,
126 Heap_UserDebug = 0x1000
129 enum RootHeapParameters
131 RootHeap_MinAlign = 16,
132 RootHeap_Granularity = 16*1024,
133 RootHeap_Reserve = 16*1024,
134 RootHeap_Threshold = 256*1024,
184 HeapDesc(
unsigned flags = 0,
186 UPInt granularity = 8*1024,
187 UPInt reserve = 8*1024,
188 UPInt threshold=~UPInt(0),
192 : Flags(flags), MinAlign(minAlign),
193 Granularity(granularity), Reserve(reserve),
194 Threshold(threshold), Limit(limit),
195 HeapId(heapId), Arena(arena)
204 Threshold = ~UPInt(0);
214 struct RootHeapDesc :
public HeapDesc
217 : HeapDesc(0, RootHeap_MinAlign,
218 RootHeap_Granularity, RootHeap_Reserve,
219 RootHeap_Threshold, RootHeap_Limit, HeapId_Global)
238 virtual ~HeapVisitor() { }
245 virtual void Visit(MemoryHeap* parentHeap, MemoryHeap *childHeap) = 0;
251 virtual ~LimitHandler() {}
260 virtual bool OnExceedLimit(MemoryHeap* heap, UPInt overLimit) = 0;
264 virtual void OnFreeSegment(MemoryHeap* heap, UPInt freeingSize) = 0;
270 virtual ~HeapTracer() {}
271 virtual void OnCreateHeap(
const MemoryHeap* heap) = 0;
272 virtual void OnDestroyHeap(
const MemoryHeap* heap) = 0;
273 virtual void OnAlloc(
const MemoryHeap* heap, UPInt size, UPInt align,
unsigned sid,
const void* ptr) = 0;
274 virtual void OnRealloc(
const MemoryHeap* heap,
const void* oldPtr, UPInt newSize,
const void* newPtr) = 0;
275 virtual void OnFree(
const MemoryHeap* heap,
const void* ptr) = 0;
281 UPInt SysMemFootprint;
282 UPInt SysMemUsedSpace;
283 UPInt PageMapFootprint;
284 UPInt PageMapUsedSpace;
285 UPInt BookkeepingFootprint;
286 UPInt BookkeepingUsedSpace;
287 UPInt DebugInfoFootprint;
288 UPInt DebugInfoUsedSpace;
289 UPInt UserDebugFootprint;
290 UPInt UserDebugUsedSpace;
295 virtual ~MemoryHeap() {}
302 static void KY_STDCALL InitPT(SysAllocPaged* sysAlloc);
303 static void KY_STDCALL InitMH(SysAlloc* sysAllocMH);
304 static void KY_STDCALL CleanUpPT();
305 static void KY_STDCALL CleanUpMH();
310 static MemoryHeap* KY_STDCALL CreateRootHeapPT();
311 static MemoryHeap* KY_STDCALL CreateRootHeapMH();
312 static MemoryHeap* KY_STDCALL CreateRootHeapPT(
const HeapDesc& desc);
313 static MemoryHeap* KY_STDCALL CreateRootHeapMH(
const HeapDesc& desc);
319 static void KY_STDCALL ReleaseRootHeapPT();
320 static void KY_STDCALL ReleaseRootHeapMH();
326 virtual void CreateArena(UPInt arena, SysAllocPaged* sysAlloc) = 0;
327 virtual void DestroyArena(UPInt arena) = 0;
328 virtual bool ArenaIsEmpty(UPInt arena) = 0;
337 virtual MemoryHeap* CreateHeap(
const char* name,
338 const HeapDesc& desc) = 0;
340 MemoryHeap* CreateHeap(
const char* name,
343 UPInt granularity = 16*1024,
344 UPInt reserve = 16*1024,
345 UPInt threshold=~UPInt(0),
350 HeapDesc desc(flags, minAlign, granularity, reserve, threshold, limit, heapId, arena);
351 return CreateHeap(name, desc);
358 void GetHeapInfo(HeapInfo* infoPtr)
const;
360 const char* GetName()
const {
return Info.pName; }
361 UPInt GetId()
const {
return Info.Desc.HeapId;}
362 MemoryHeap* GetParentHeap()
const {
return Info.pParent; }
363 unsigned GetFlags()
const {
return Info.Desc.Flags; }
364 UPInt GetGranularity()
const {
return Info.Desc.Granularity; }
366 virtual void SetLimitHandler(LimitHandler* handler) = 0;
367 virtual void SetLimit(UPInt newLimit) = 0;
368 UPInt GetLimit()
const {
return Info.Desc.Limit; }
372 inline bool IsThreadSafe()
const
374 return (Info.Desc.Flags & Heap_ThreadUnsafe) == 0;
382 virtual void AddRef() = 0;
389 virtual void Release() = 0;
394 void ReleaseOnFree(
void *ptr);
397 void AssignToCurrentThread();
401 virtual void* Alloc(UPInt size,
const AllocInfo* info = 0) = 0;
402 virtual void* Alloc(UPInt size, UPInt align,
const AllocInfo* info = 0) = 0;
406 virtual void* Realloc(
void* oldPtr, UPInt newSize) = 0;
407 virtual void* ReallocAutoHeap(
void* oldPtr, UPInt newSize) {
return Realloc(oldPtr, newSize); }
409 virtual void Free(
void* ptr) = 0;
413 virtual void* AllocAutoHeap(
const void *thisPtr, UPInt size,
414 const AllocInfo* info = 0) = 0;
417 virtual void* AllocAutoHeap(
const void *thisPtr, UPInt size, UPInt align,
418 const AllocInfo* info = 0) = 0;
423 virtual MemoryHeap* GetAllocHeap(
const void *thisPtr) = 0;
426 virtual UPInt GetUsableSize(
const void* ptr) = 0;
434 virtual void* AllocSysDirect(UPInt size) = 0;
435 virtual void FreeSysDirect(
void* ptr, UPInt size) = 0;
442 virtual bool GetStats(StatBag* bag) = 0;
448 virtual UPInt GetFootprint()
const = 0;
449 virtual UPInt GetTotalFootprint()
const = 0;
450 virtual UPInt GetUsedSpace()
const = 0;
451 virtual UPInt GetTotalUsedSpace()
const = 0;
452 virtual void GetRootStats(RootStats* stats) = 0;
457 virtual void VisitMem(Heap::MemVisitor* visitor,
unsigned flags) = 0;
459 virtual void VisitRootSegments(Heap::SegVisitor* visitor) = 0;
460 virtual void VisitHeapSegments(Heap::SegVisitor* visitor)
const = 0;
462 virtual void SetTracer(HeapTracer* tracer) = 0;
465 void MemReport(
class StringBuffer& buffer, MemReportType detailed,
bool xmlFormat =
false);
466 void MemReport(
struct MemItem* rootItem, MemReportType detailed);
471 bool DumpMemoryLeaks();
473 void UltimateCheck();
476 void VisitChildHeaps(HeapVisitor* visitor);
477 void LockAndVisit(HeapVisitor* visitor);
478 void CheckIntegrity();
484 void ReleaseCachedMem();
487 virtual void destroyItself() = 0;
488 virtual void ultimateCheck() = 0;
489 virtual void releaseCachedMem() = 0;
490 virtual bool dumpMemoryLeaks() = 0;
491 virtual void checkIntegrity()
const = 0;
492 virtual void getUserDebugStats(RootStats* stats)
const = 0;
494 typedef List<MemoryHeap> ChildListType;
497 volatile unsigned RefCount;
505 ChildListType ChildHeaps;
506 mutable Lock HeapLock;
Definition: gamekitcrowddispersion.h:20