20 #ifdef KY_MEMORY_ENABLE_DEBUG_INFO
26 namespace Kaim {
namespace HeapMH {
34 struct DebugDataPoolMH : ListNode<DebugDataPoolMH<T> >
36 typedef DebugDataPoolMH<T> SelfType;
38 DebugDataPoolMH() : UseCount(0) {}
40 static UPInt GetSize(UPInt bytes)
42 return (bytes -
sizeof(SelfType)) /
sizeof(T);
45 T* GetElement(UPInt i)
47 return (T*)((
UByte*)
this +
sizeof(SelfType) + i*
sizeof(T));
55 struct DebugDataMH : ListNode<DebugDataMH>
57 enum { ChainLimit = 10 };
59 typedef DebugDataPoolMH<DebugDataMH> DataPool;
70 memset(&Info, 0,
sizeof(Info));
75 memset(&DataCount, 0xFE,
sizeof(DataCount));
76 memset(&ChainCount, 0xFE,
sizeof(ChainCount));
77 memset(&pParent, 0xFE,
sizeof(pParent));
78 memset(&pNextData, 0xFE,
sizeof(pNextData));
79 memset(&RefCount, 0xFE,
sizeof(RefCount));
80 memset(&Address, 0xFE,
sizeof(Address));
81 memset(&Size, 0xFE,
sizeof(Size));
82 memset(&Info, 0xFE,
sizeof(Info));
90 DebugDataMH* pNextData;
105 PoolSize = Heap_DebugAllocPoolSize,
108 typedef DebugDataPoolMH<DebugDataMH> DataPoolType;
113 DebugDataPtr() : pData(0), Index(~UPInt(0)), pSelf(0), pPrev(0) {}
120 DebugStorageMH(SysAlloc* alloc, LockSafe* rootLocker);
122 unsigned GetStatId(PageInfoMH* page, UPInt parentAddr,
const AllocInfo* info);
124 bool AddAlloc(UPInt addr, UPInt size, PageInfoMH* pageInfo,
const AllocInfo* info);
126 bool AddAlloc(PageInfoMH* parentInfo, UPInt parentAddr, UPInt thisAddr,
127 UPInt size, PageInfoMH* pageInfo,
const AllocInfo* info);
129 void RemoveAlloc(UPInt addr, PageInfoMH* pageInfo);
131 void RelinkAlloc(DebugDataPtr* ptr, UPInt oldAddr,
132 UPInt newAddr, UPInt newSize, PageInfoMH* newInfo);
134 void CheckDataTail(
const DebugDataPtr* ptr, UPInt usable);
138 void GetDebugData(UPInt addr, PageInfoMH* pageInfo, DebugDataPtr* ptr);
140 void UnlinkAlloc(UPInt addr, PageInfoMH* pageInfo, DebugDataPtr* ptr);
142 const DebugDataMH* GetFirstEntry()
const;
143 const DebugDataMH* GetNextEntry(
const DebugDataMH* entry)
const;
145 void VisitMem(MemVisitor* visitor,
unsigned flags)
const;
147 bool DumpMemoryLeaks(
const char* heapName);
149 void UltimateCheck();
151 UPInt GetUsedSpace()
const;
154 bool allocDataPool();
155 void freeDataPool(DataPoolType* pool);
157 DebugDataMH* getDebugData(PageInfoMH* page);
158 void setDebugData(PageInfoMH* page, DebugDataMH* data);
159 DebugDataMH* allocDebugData();
160 void freeDebugData(DebugDataMH* data);
161 void unlinkDebugData(PageInfoMH* page, DebugDataPtr* ptr);
162 void linkDebugData(PageInfoMH* page, DebugDataMH* data);
163 void findInChainWithin(DebugDataMH* chain, UPInt addr, DebugDataPtr* ptr);
164 void findInChainExact(DebugDataMH* chain, UPInt addr, DebugDataPtr* ptr);
165 void findDebugData(PageInfoMH* page, UPInt addr, DebugDataPtr* ret);
166 void fillDataTail(DebugDataMH* data, UPInt usable);
167 void reportViolation(DebugDataMH* data,
const char* msg);
169 SysAlloc* pAllocator;
170 List<DataPoolType> DataPools;
171 List<DebugDataMH> UsedDataList;
172 List<DebugDataMH> FreeDataList;
173 LockSafe* pRootLocker;
178 #endif // KY_MEMORY_ENABLE_DEBUG_INFO
std::uint8_t UByte
uint8_t
Definition: SF_Types.h:134
The Autodesk Navigation namespace.
Definition: gamekitcrowddispersion.cpp:17