[HEAP]
[reactos.git] / reactos / lib / rtl / heap.h
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS System Libraries
4 * FILE: lib/rtl/heap.h
5 * PURPOSE: Run-Time Libary Heap Manager header
6 * PROGRAMMER: Aleksey Bragin
7 */
8
9 /* INCLUDES ******************************************************************/
10
11 #ifndef RTL_HEAP_H
12 #define RTL_HEAP_H
13
14 /* Core heap definitions */
15 #define HEAP_FREELISTS 128
16 #define HEAP_SEGMENTS 64
17
18 #define HEAP_ENTRY_SIZE ((ULONG)sizeof(HEAP_ENTRY))
19 #define HEAP_ENTRY_SHIFT 3
20 #define HEAP_MAX_BLOCK_SIZE ((0x80000 - PAGE_SIZE) >> HEAP_ENTRY_SHIFT)
21
22 #define ARENA_INUSE_FILLER 0xBAADF00D
23 #define ARENA_FREE_FILLER 0xFEEEFEEE
24 #define HEAP_TAIL_FILL 0xab
25
26 // from ntifs.h, should go to another header!
27 #define HEAP_GLOBAL_TAG 0x0800
28 #define HEAP_PSEUDO_TAG_FLAG 0x8000
29 #define HEAP_TAG_MASK (HEAP_MAXIMUM_TAG << HEAP_TAG_SHIFT)
30
31 #define HEAP_EXTRA_FLAGS_MASK (HEAP_CAPTURE_STACK_BACKTRACES | \
32 HEAP_SETTABLE_USER_VALUE | \
33 (HEAP_TAG_MASK ^ (0xFF << HEAP_TAG_SHIFT)))
34
35 /* Heap entry flags */
36 #define HEAP_ENTRY_BUSY 0x01
37 #define HEAP_ENTRY_EXTRA_PRESENT 0x02
38 #define HEAP_ENTRY_FILL_PATTERN 0x04
39 #define HEAP_ENTRY_VIRTUAL_ALLOC 0x08
40 #define HEAP_ENTRY_LAST_ENTRY 0x10
41 #define HEAP_ENTRY_SETTABLE_FLAG1 0x20
42 #define HEAP_ENTRY_SETTABLE_FLAG2 0x40
43 #define HEAP_ENTRY_SETTABLE_FLAG3 0x80
44 #define HEAP_ENTRY_SETTABLE_FLAGS (HEAP_ENTRY_SETTABLE_FLAG1 | HEAP_ENTRY_SETTABLE_FLAG2 | HEAP_ENTRY_SETTABLE_FLAG3)
45
46 /* Signatures */
47 #define HEAP_SIGNATURE 0xeefeeff
48 #define HEAP_SEGMENT_SIGNATURE 0xffeeffee
49
50 /* Segment flags */
51 #define HEAP_USER_ALLOCATED 0x1
52
53 /* Heap structures */
54 struct _HEAP_COMMON_ENTRY
55 {
56 union
57 {
58 struct
59 {
60 USHORT Size;
61 UCHAR Flags;
62 UCHAR SmallTagIndex;
63 };
64 struct
65 {
66 PVOID SubSegmentCode;
67 USHORT PreviousSize;
68 union
69 {
70 UCHAR SegmentOffset;
71 UCHAR LFHFlags;
72 };
73 UCHAR UnusedBytes;
74 };
75 struct
76 {
77 USHORT FunctionIndex;
78 USHORT ContextValue;
79 };
80 struct
81 {
82 ULONG InterceptorValue;
83 USHORT UnusedBytesLength;
84 UCHAR EntryOffset;
85 UCHAR ExtendedBlockSignature;
86 };
87 struct
88 {
89 ULONG Code1;
90 USHORT Code2;
91 UCHAR Code3;
92 UCHAR Code4;
93 };
94 ULONGLONG AgregateCode;
95 };
96 };
97
98 typedef struct _HEAP_FREE_ENTRY
99 {
100 struct _HEAP_COMMON_ENTRY;
101 LIST_ENTRY FreeList;
102 } HEAP_FREE_ENTRY, *PHEAP_FREE_ENTRY;
103
104 typedef struct _HEAP_ENTRY
105 {
106 struct _HEAP_COMMON_ENTRY;
107 } HEAP_ENTRY, *PHEAP_ENTRY;
108
109 C_ASSERT(sizeof(HEAP_ENTRY) == 8);
110 C_ASSERT((1 << HEAP_ENTRY_SHIFT) == sizeof(HEAP_ENTRY));
111
112 typedef struct _HEAP_TAG_ENTRY
113 {
114 ULONG Allocs;
115 ULONG Frees;
116 ULONG Size;
117 USHORT TagIndex;
118 USHORT CreatorBackTraceIndex;
119 WCHAR TagName[24];
120 } HEAP_TAG_ENTRY, *PHEAP_TAG_ENTRY;
121
122 typedef struct _HEAP_PSEUDO_TAG_ENTRY
123 {
124 ULONG Allocs;
125 ULONG Frees;
126 ULONG Size;
127 } HEAP_PSEUDO_TAG_ENTRY, *PHEAP_PSEUDO_TAG_ENTRY;
128
129 typedef struct _HEAP_COUNTERS
130 {
131 ULONG TotalMemoryReserved;
132 ULONG TotalMemoryCommitted;
133 ULONG TotalMemoryLargeUCR;
134 ULONG TotalSizeInVirtualBlocks;
135 ULONG TotalSegments;
136 ULONG TotalUCRs;
137 ULONG CommittOps;
138 ULONG DeCommitOps;
139 ULONG LockAcquires;
140 ULONG LockCollisions;
141 ULONG CommitRate;
142 ULONG DecommittRate;
143 ULONG CommitFailures;
144 ULONG InBlockCommitFailures;
145 ULONG CompactHeapCalls;
146 ULONG CompactedUCRs;
147 ULONG InBlockDeccommits;
148 ULONG InBlockDeccomitSize;
149 } HEAP_COUNTERS, *PHEAP_COUNTERS;
150
151 typedef struct _HEAP_TUNING_PARAMETERS
152 {
153 ULONG CommittThresholdShift;
154 ULONG MaxPreCommittThreshold;
155 } HEAP_TUNING_PARAMETERS, *PHEAP_TUNING_PARAMETERS;
156
157 typedef struct _HEAP
158 {
159 HEAP_ENTRY Entry;
160 ULONG SegmentSignature;
161 ULONG SegmentFlags;
162 LIST_ENTRY SegmentListEntry;
163 struct _HEAP *Heap;
164 PVOID BaseAddress;
165 ULONG NumberOfPages;
166 PHEAP_ENTRY FirstEntry;
167 PHEAP_ENTRY LastValidEntry;
168 ULONG NumberOfUnCommittedPages;
169 ULONG NumberOfUnCommittedRanges;
170 USHORT SegmentAllocatorBackTraceIndex;
171 USHORT Reserved;
172 LIST_ENTRY UCRSegmentList;
173 ULONG Flags;
174 ULONG ForceFlags;
175 ULONG CompatibilityFlags;
176 ULONG EncodeFlagMask;
177 HEAP_ENTRY Encoding;
178 ULONG PointerKey;
179 ULONG Interceptor;
180 ULONG VirtualMemoryThreshold;
181 ULONG Signature;
182 ULONG SegmentReserve;
183 ULONG SegmentCommit;
184 ULONG DeCommitFreeBlockThreshold;
185 ULONG DeCommitTotalFreeThreshold;
186 ULONG TotalFreeSize;
187 ULONG MaximumAllocationSize;
188 USHORT ProcessHeapsListIndex;
189 USHORT HeaderValidateLength;
190 PVOID HeaderValidateCopy;
191 USHORT NextAvailableTagIndex;
192 USHORT MaximumTagIndex;
193 PHEAP_TAG_ENTRY TagEntries;
194 LIST_ENTRY UCRList;
195 ULONG AlignRound;
196 ULONG AlignMask;
197 LIST_ENTRY VirtualAllocdBlocks;
198 LIST_ENTRY SegmentList;
199 struct _HEAP_SEGMENT *Segments[HEAP_SEGMENTS]; //FIXME: non-Vista
200 USHORT AllocatorBackTraceIndex;
201 ULONG NonDedicatedListLength;
202 PVOID BlocksIndex;
203 PVOID UCRIndex;
204 PHEAP_PSEUDO_TAG_ENTRY PseudoTagEntries;
205 LIST_ENTRY FreeLists[HEAP_FREELISTS]; //FIXME: non-Vista
206 union
207 {
208 ULONG FreeListsInUseUlong[HEAP_FREELISTS / (sizeof(ULONG) * 8)]; //FIXME: non-Vista
209 UCHAR FreeListsInUseBytes[HEAP_FREELISTS / (sizeof(UCHAR) * 8)]; //FIXME: non-Vista
210 } u;
211 PHEAP_LOCK LockVariable;
212 PRTL_HEAP_COMMIT_ROUTINE CommitRoutine;
213 PVOID FrontEndHeap;
214 USHORT FrontHeapLockCount;
215 UCHAR FrontEndHeapType;
216 HEAP_COUNTERS Counters;
217 HEAP_TUNING_PARAMETERS TuningParameters;
218 } HEAP, *PHEAP;
219
220 typedef struct _HEAP_SEGMENT
221 {
222 HEAP_ENTRY Entry;
223 ULONG SegmentSignature;
224 ULONG SegmentFlags;
225 LIST_ENTRY SegmentListEntry;
226 PHEAP Heap;
227 PVOID BaseAddress;
228 ULONG NumberOfPages;
229 PHEAP_ENTRY FirstEntry;
230 PHEAP_ENTRY LastValidEntry;
231 ULONG NumberOfUnCommittedPages;
232 ULONG NumberOfUnCommittedRanges;
233 USHORT SegmentAllocatorBackTraceIndex;
234 USHORT Reserved;
235 LIST_ENTRY UCRSegmentList;
236 PHEAP_ENTRY LastEntryInSegment; //FIXME: non-Vista
237 } HEAP_SEGMENT, *PHEAP_SEGMENT;
238
239 typedef struct _HEAP_UCR_DESCRIPTOR
240 {
241 LIST_ENTRY ListEntry;
242 LIST_ENTRY SegmentEntry;
243 PVOID Address;
244 ULONG Size;
245 } HEAP_UCR_DESCRIPTOR, *PHEAP_UCR_DESCRIPTOR;
246
247 typedef struct _HEAP_ENTRY_EXTRA
248 {
249 union
250 {
251 struct
252 {
253 USHORT AllocatorBackTraceIndex;
254 USHORT TagIndex;
255 ULONG_PTR Settable;
256 };
257 UINT64 ZeroInit;
258 };
259 } HEAP_ENTRY_EXTRA, *PHEAP_ENTRY_EXTRA;
260
261 typedef HEAP_ENTRY_EXTRA HEAP_FREE_ENTRY_EXTRA, *PHEAP_FREE_ENTRY_EXTRA;
262
263 typedef struct _HEAP_VIRTUAL_ALLOC_ENTRY
264 {
265 LIST_ENTRY Entry;
266 HEAP_ENTRY_EXTRA ExtraStuff;
267 ULONG CommitSize;
268 ULONG ReserveSize;
269 HEAP_ENTRY BusyBlock;
270 } HEAP_VIRTUAL_ALLOC_ENTRY, *PHEAP_VIRTUAL_ALLOC_ENTRY;
271
272 /* Global variables */
273 extern HEAP_LOCK RtlpProcessHeapsListLock;
274 extern BOOLEAN RtlpPageHeapEnabled;
275
276 /* Functions declarations */
277
278 /* heap.c */
279 PHEAP_FREE_ENTRY NTAPI
280 RtlpCoalesceFreeBlocks (PHEAP Heap,
281 PHEAP_FREE_ENTRY FreeEntry,
282 PSIZE_T FreeSize,
283 BOOLEAN Remove);
284
285 PHEAP_ENTRY_EXTRA NTAPI
286 RtlpGetExtraStuffPointer(PHEAP_ENTRY HeapEntry);
287
288 /* heapdbg.c */
289 HANDLE NTAPI
290 RtlpPageHeapCreate(ULONG Flags,
291 PVOID Addr,
292 SIZE_T TotalSize,
293 SIZE_T CommitSize,
294 PVOID Lock,
295 PRTL_HEAP_PARAMETERS Parameters);
296
297 #endif