16 #ifndef INC_KY_Kernel_HeapMH_DebugInfo_H
17 #define INC_KY_Kernel_HeapMH_DebugInfo_H
21 #ifdef KY_MEMORY_ENABLE_DEBUG_INFO
27 namespace Kaim {
namespace HeapMH {
35 struct DebugDataPoolMH : ListNode<DebugDataPoolMH<T> >
37 typedef DebugDataPoolMH<T> SelfType;
39 DebugDataPoolMH() : UseCount(0) {}
41 static UPInt GetSize(UPInt bytes)
43 return (bytes -
sizeof(SelfType)) /
sizeof(T);
46 T* GetElement(UPInt i)
48 return (T*)((UByte*)
this +
sizeof(SelfType) + i*
sizeof(T));
56 struct DebugDataMH : ListNode<DebugDataMH>
58 enum { ChainLimit = 10 };
60 typedef DebugDataPoolMH<DebugDataMH> DataPool;
71 memset(&Info, 0,
sizeof(Info));
76 memset(&DataCount, 0xFE,
sizeof(DataCount));
77 memset(&ChainCount, 0xFE,
sizeof(ChainCount));
78 memset(&pParent, 0xFE,
sizeof(pParent));
79 memset(&pNextData, 0xFE,
sizeof(pNextData));
80 memset(&RefCount, 0xFE,
sizeof(RefCount));
81 memset(&Address, 0xFE,
sizeof(Address));
82 memset(&Size, 0xFE,
sizeof(Size));
83 memset(&Info, 0xFE,
sizeof(Info));
91 DebugDataMH* pNextData;
106 PoolSize = Heap_DebugAllocPoolSize,
109 typedef DebugDataPoolMH<DebugDataMH> DataPoolType;
114 DebugDataPtr() : pData(0), Index(~UPInt(0)), pSelf(0), pPrev(0) {}
121 DebugStorageMH(SysAlloc* alloc, LockSafe* rootLocker);
123 unsigned GetStatId(PageInfoMH* page, UPInt parentAddr,
const AllocInfo* info);
125 bool AddAlloc(UPInt addr, UPInt size, PageInfoMH* pageInfo,
const AllocInfo* info);
127 bool AddAlloc(PageInfoMH* parentInfo, UPInt parentAddr, UPInt thisAddr,
128 UPInt size, PageInfoMH* pageInfo,
const AllocInfo* info);
130 void RemoveAlloc(UPInt addr, PageInfoMH* pageInfo);
132 void RelinkAlloc(DebugDataPtr* ptr, UPInt oldAddr,
133 UPInt newAddr, UPInt newSize, PageInfoMH* newInfo);
135 void CheckDataTail(
const DebugDataPtr* ptr, UPInt usable);
139 void GetDebugData(UPInt addr, PageInfoMH* pageInfo, DebugDataPtr* ptr);
141 void UnlinkAlloc(UPInt addr, PageInfoMH* pageInfo, DebugDataPtr* ptr);
143 void GetStats(AllocEngineMH* allocator, StatBag* bag)
const;
145 const DebugDataMH* GetFirstEntry()
const;
146 const DebugDataMH* GetNextEntry(
const DebugDataMH* entry)
const;
148 void VisitMem(MemVisitor* visitor,
unsigned flags)
const;
150 bool DumpMemoryLeaks(
const char* heapName);
152 void UltimateCheck();
154 UPInt GetUsedSpace()
const;
157 bool allocDataPool();
158 void freeDataPool(DataPoolType* pool);
160 DebugDataMH* getDebugData(PageInfoMH* page);
161 void setDebugData(PageInfoMH* page, DebugDataMH* data);
162 DebugDataMH* allocDebugData();
163 void freeDebugData(DebugDataMH* data);
164 void unlinkDebugData(PageInfoMH* page, DebugDataPtr* ptr);
165 void linkDebugData(PageInfoMH* page, DebugDataMH* data);
166 void findInChainWithin(DebugDataMH* chain, UPInt addr, DebugDataPtr* ptr);
167 void findInChainExact(DebugDataMH* chain, UPInt addr, DebugDataPtr* ptr);
168 void findDebugData(PageInfoMH* page, UPInt addr, DebugDataPtr* ret);
169 void fillDataTail(DebugDataMH* data, UPInt usable);
170 void reportViolation(DebugDataMH* data,
const char* msg);
172 SysAlloc* pAllocator;
173 List<DataPoolType> DataPools;
174 List<DebugDataMH> UsedDataList;
175 List<DebugDataMH> FreeDataList;
176 LockSafe* pRootLocker;
181 #endif // KY_MEMORY_ENABLE_DEBUG_INFO
Definition: gamekitcrowddispersion.h:20