17 #ifndef INC_KY_Kernel_HeapPT_PageTable_H
18 #define INC_KY_Kernel_HeapPT_PageTable_H
23 namespace Kaim {
namespace HeapPT {
27 #ifdef KY_64BIT_POINTERS
29 #define Heap_Lv1_PageSize (UPInt(1) << Heap_Lv1_PageShift)
30 #define Heap_Lv2_PageSize (UPInt(1) << Heap_Lv2_PageShift)
31 #define Heap_Lv3_PageSize (UPInt(1) << Heap_Lv3_PageShift)
32 #define Heap_Lv4_PageSize (UPInt(1) << Heap_Lv4_PageShift)
33 #define Heap_Lv5_PageSize (UPInt(1) << Heap_Lv5_PageShift)
35 #define Heap_Lv1_PageMask ((UPInt(1) << Heap_Lv1_PageShift) - 1)
36 #define Heap_Lv2_PageMask ((UPInt(1) << Heap_Lv2_PageShift) - 1)
37 #define Heap_Lv3_PageMask ((UPInt(1) << Heap_Lv3_PageShift) - 1)
38 #define Heap_Lv4_PageMask ((UPInt(1) << Heap_Lv4_PageShift) - 1)
39 #define Heap_Lv5_PageMask ((UPInt(1) << Heap_Lv5_PageShift) - 1)
45 template<
class T, UPInt N>
class HeapHeader
52 HeapHeader() : pTable(0), RefCount(0) {}
54 T* GetTable()
const {
return pTable; }
55 T* GetTable(UPInt i)
const {
return &pTable[i]; }
59 #ifndef KY_64BIT_POINTERS
61 bool HasTable()
const {
return pTable != 0; }
65 KY_INLINE
bool HasTable(UPInt address)
const;
69 bool AddRef(Starter* starter)
76 pTable = (T*)starter->Alloc(
sizeof(T) * N,
sizeof(
void*) * N);
82 memset(pTable, 0,
sizeof(T) * N);
88 void Release(Starter* starter)
92 starter->Free((UByte*)pTable,
sizeof(T) * N,
sizeof(
void*) * N);
103 HeapSegment* pSegment;
104 #ifdef KY_MEMORY_ENABLE_DEBUG_INFO
105 DebugNode* pDebugNode;
109 #ifndef KY_64BIT_POINTERS
114 typedef HeapHeader<HeapHeader1, Heap_Lv1_TableSize> HeapHeader2;
115 typedef HeapHeader2 HeapHeaderRoot;
121 typedef HeapHeader<HeapHeader1, Heap_Lv1_TableSize> HeapHeader2;
122 typedef HeapHeader<HeapHeader2, Heap_Lv2_TableSize> HeapHeader3;
123 typedef HeapHeader<HeapHeader3, Heap_Lv3_TableSize> HeapHeader4;
124 typedef HeapHeader<HeapHeader4, Heap_Lv4_TableSize> HeapHeader5;
126 typedef HeapHeader5 HeapHeaderRoot;
129 template<
class T, UPInt N>
130 inline bool HeapHeader<T,N>::HasTable(UPInt address)
const
132 UPInt i4 = (address & Heap_Lv5_PageMask) >> Heap_Lv4_PageShift;
133 UPInt i3 = (address & Heap_Lv4_PageMask) >> Heap_Lv3_PageShift;
134 UPInt i2 = (address & Heap_Lv3_PageMask) >> Heap_Lv2_PageShift;
137 HeapHeader4* table4 = this->GetTable();
140 HeapHeader3* table3 = table4[i4].GetTable();
143 HeapHeader2* table2 = table3[i3].GetTable();
146 HeapHeader1* table1 = table2[i2].GetTable();
180 void SetStarter(Starter* s) { pStarter = s; }
181 Starter* GetStarter() {
return pStarter; }
186 KY_INLINE HeapSegment* GetSegment(UPInt address)
const
189 #ifndef KY_64BIT_POINTERS
191 UPInt rootIndex = address >> Heap_Root_PageShift;
192 const HeapHeaderRoot* rootHeader = RootTable + rootIndex;
193 UPInt i1 = (address & Heap_Lv2_PageMask) >> Heap_Lv1_PageShift;
194 return rootHeader->GetTable()[i1].pSegment;
198 UPInt i5 = address >> Heap_Lv5_PageShift;
199 UPInt i4 = (address & Heap_Lv5_PageMask) >> Heap_Lv4_PageShift;
200 UPInt i3 = (address & Heap_Lv4_PageMask) >> Heap_Lv3_PageShift;
201 UPInt i2 = (address & Heap_Lv3_PageMask) >> Heap_Lv2_PageShift;
202 UPInt i1 = (address & Heap_Lv2_PageMask) >> Heap_Lv1_PageShift;
204 const HeapHeaderRoot* rootHeader = RootTable + i5;
210 GetTable(i1)->pSegment;
217 KY_INLINE HeapSegment* GetSegmentSafe(UPInt address)
const
220 #ifndef KY_64BIT_POINTERS
222 UPInt rootIndex = address >> Heap_Root_PageShift;
223 UPInt i1 = (address & Heap_Lv2_PageMask) >> Heap_Lv1_PageShift;
224 const HeapHeaderRoot* rootHeader = RootTable + rootIndex;
226 return rootHeader->HasTable() ? (rootHeader->GetTable()[i1].pSegment) : 0;
230 UPInt i5 = address >> Heap_Lv5_PageShift;
231 UPInt i4 = (address & Heap_Lv5_PageMask) >> Heap_Lv4_PageShift;
232 UPInt i3 = (address & Heap_Lv4_PageMask) >> Heap_Lv3_PageShift;
233 UPInt i2 = (address & Heap_Lv3_PageMask) >> Heap_Lv2_PageShift;
234 UPInt i1 = (address & Heap_Lv2_PageMask) >> Heap_Lv1_PageShift;
236 const HeapHeaderRoot* table5 = RootTable + i5;
239 const HeapHeader4* table4 = table5->GetTable(i4);
242 const HeapHeader3* table3 = table4->GetTable(i3);
245 const HeapHeader2* table2 = table3->GetTable(i2);
248 const HeapHeader1* table1 = table2->GetTable(i1);
251 return table1->pSegment;
270 bool MapRange(
void* address, UPInt size);
273 void UnmapRange(
void* address, UPInt size);
276 bool RemapRange(
void* address, UPInt newSize, UPInt oldSize);
280 void SetSegmentInRange(UPInt address, UPInt size, HeapSegment* seg);
282 #ifdef KY_MEMORY_ENABLE_DEBUG_INFO
283 void SetDebugNode(UPInt address, DebugNode* page);
284 DebugNode* GetDebugNode(UPInt address)
const;
285 DebugNode* FindDebugNode(UPInt address)
const;
288 void VisitMem(MemVisitor* visitor)
290 pStarter->VisitMem(visitor);
301 HeapHeaderRoot RootTable[Heap_Root_TableSize];
304 extern PageTable* GlobalPageTable;
Definition: gamekitcrowddispersion.h:20