2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS System Libraries
5 * PURPOSE: Run-Time Libary Heap Manager header
6 * PROGRAMMER: Aleksey Bragin
9 /* INCLUDES ******************************************************************/
14 /* Core heap definitions */
15 #define HEAP_FREELISTS 128
16 #define HEAP_SEGMENTS 64
18 #define HEAP_ENTRY_SIZE ((ULONG)sizeof(HEAP_ENTRY))
20 #define HEAP_ENTRY_SHIFT 4
22 #define HEAP_ENTRY_SHIFT 3
24 #define HEAP_MAX_BLOCK_SIZE ((0x80000 - PAGE_SIZE) >> HEAP_ENTRY_SHIFT)
26 #define ARENA_INUSE_FILLER 0xBAADF00D
27 #define ARENA_FREE_FILLER 0xFEEEFEEE
28 #define HEAP_TAIL_FILL 0xab
30 // from ntifs.h, should go to another header!
31 #define HEAP_GLOBAL_TAG 0x0800
32 #define HEAP_PSEUDO_TAG_FLAG 0x8000
33 #define HEAP_TAG_MASK (HEAP_MAXIMUM_TAG << HEAP_TAG_SHIFT)
35 #define HEAP_EXTRA_FLAGS_MASK (HEAP_CAPTURE_STACK_BACKTRACES | \
36 HEAP_SETTABLE_USER_VALUE | \
37 (HEAP_TAG_MASK ^ (0xFF << HEAP_TAG_SHIFT)))
39 /* Heap entry flags */
40 #define HEAP_ENTRY_BUSY 0x01
41 #define HEAP_ENTRY_EXTRA_PRESENT 0x02
42 #define HEAP_ENTRY_FILL_PATTERN 0x04
43 #define HEAP_ENTRY_VIRTUAL_ALLOC 0x08
44 #define HEAP_ENTRY_LAST_ENTRY 0x10
45 #define HEAP_ENTRY_SETTABLE_FLAG1 0x20
46 #define HEAP_ENTRY_SETTABLE_FLAG2 0x40
47 #define HEAP_ENTRY_SETTABLE_FLAG3 0x80
48 #define HEAP_ENTRY_SETTABLE_FLAGS (HEAP_ENTRY_SETTABLE_FLAG1 | HEAP_ENTRY_SETTABLE_FLAG2 | HEAP_ENTRY_SETTABLE_FLAG3)
51 #define HEAP_SIGNATURE 0xeefeeff
52 #define HEAP_SEGMENT_SIGNATURE 0xffeeffee
55 #define HEAP_USER_ALLOCATED 0x1
58 struct _HEAP_COMMON_ENTRY
86 ULONG InterceptorValue
;
87 USHORT UnusedBytesLength
;
89 UCHAR ExtendedBlockSignature
;
98 ULONGLONG AgregateCode
;
102 typedef struct _HEAP_FREE_ENTRY
104 struct _HEAP_COMMON_ENTRY
;
106 } HEAP_FREE_ENTRY
, *PHEAP_FREE_ENTRY
;
108 typedef struct _HEAP_ENTRY
110 struct _HEAP_COMMON_ENTRY
;
111 } HEAP_ENTRY
, *PHEAP_ENTRY
;
114 C_ASSERT(sizeof(HEAP_ENTRY
) == 16);
116 C_ASSERT(sizeof(HEAP_ENTRY
) == 8);
118 C_ASSERT((1 << HEAP_ENTRY_SHIFT
) == sizeof(HEAP_ENTRY
));
120 typedef struct _HEAP_TAG_ENTRY
126 USHORT CreatorBackTraceIndex
;
128 } HEAP_TAG_ENTRY
, *PHEAP_TAG_ENTRY
;
130 typedef struct _HEAP_PSEUDO_TAG_ENTRY
135 } HEAP_PSEUDO_TAG_ENTRY
, *PHEAP_PSEUDO_TAG_ENTRY
;
137 typedef struct _HEAP_COUNTERS
139 ULONG TotalMemoryReserved
;
140 ULONG TotalMemoryCommitted
;
141 ULONG TotalMemoryLargeUCR
;
142 ULONG TotalSizeInVirtualBlocks
;
148 ULONG LockCollisions
;
151 ULONG CommitFailures
;
152 ULONG InBlockCommitFailures
;
153 ULONG CompactHeapCalls
;
155 ULONG InBlockDeccommits
;
156 ULONG InBlockDeccomitSize
;
157 } HEAP_COUNTERS
, *PHEAP_COUNTERS
;
159 typedef struct _HEAP_TUNING_PARAMETERS
161 ULONG CommittThresholdShift
;
162 ULONG MaxPreCommittThreshold
;
163 } HEAP_TUNING_PARAMETERS
, *PHEAP_TUNING_PARAMETERS
;
168 ULONG SegmentSignature
;
170 LIST_ENTRY SegmentListEntry
;
174 PHEAP_ENTRY FirstEntry
;
175 PHEAP_ENTRY LastValidEntry
;
176 ULONG NumberOfUnCommittedPages
;
177 ULONG NumberOfUnCommittedRanges
;
178 USHORT SegmentAllocatorBackTraceIndex
;
180 LIST_ENTRY UCRSegmentList
;
183 ULONG CompatibilityFlags
;
184 ULONG EncodeFlagMask
;
188 ULONG VirtualMemoryThreshold
;
190 ULONG SegmentReserve
;
192 ULONG DeCommitFreeBlockThreshold
;
193 ULONG DeCommitTotalFreeThreshold
;
195 ULONG MaximumAllocationSize
;
196 USHORT ProcessHeapsListIndex
;
197 USHORT HeaderValidateLength
;
198 PVOID HeaderValidateCopy
;
199 USHORT NextAvailableTagIndex
;
200 USHORT MaximumTagIndex
;
201 PHEAP_TAG_ENTRY TagEntries
;
205 LIST_ENTRY VirtualAllocdBlocks
;
206 LIST_ENTRY SegmentList
;
207 struct _HEAP_SEGMENT
*Segments
[HEAP_SEGMENTS
]; //FIXME: non-Vista
208 USHORT AllocatorBackTraceIndex
;
209 ULONG NonDedicatedListLength
;
212 PHEAP_PSEUDO_TAG_ENTRY PseudoTagEntries
;
213 LIST_ENTRY FreeLists
[HEAP_FREELISTS
]; //FIXME: non-Vista
216 ULONG FreeListsInUseUlong
[HEAP_FREELISTS
/ (sizeof(ULONG
) * 8)]; //FIXME: non-Vista
217 UCHAR FreeListsInUseBytes
[HEAP_FREELISTS
/ (sizeof(UCHAR
) * 8)]; //FIXME: non-Vista
219 PHEAP_LOCK LockVariable
;
220 PRTL_HEAP_COMMIT_ROUTINE CommitRoutine
;
222 USHORT FrontHeapLockCount
;
223 UCHAR FrontEndHeapType
;
224 HEAP_COUNTERS Counters
;
225 HEAP_TUNING_PARAMETERS TuningParameters
;
228 typedef struct _HEAP_SEGMENT
231 ULONG SegmentSignature
;
233 LIST_ENTRY SegmentListEntry
;
237 PHEAP_ENTRY FirstEntry
;
238 PHEAP_ENTRY LastValidEntry
;
239 ULONG NumberOfUnCommittedPages
;
240 ULONG NumberOfUnCommittedRanges
;
241 USHORT SegmentAllocatorBackTraceIndex
;
243 LIST_ENTRY UCRSegmentList
;
244 PHEAP_ENTRY LastEntryInSegment
; //FIXME: non-Vista
245 } HEAP_SEGMENT
, *PHEAP_SEGMENT
;
247 typedef struct _HEAP_UCR_DESCRIPTOR
249 LIST_ENTRY ListEntry
;
250 LIST_ENTRY SegmentEntry
;
253 } HEAP_UCR_DESCRIPTOR
, *PHEAP_UCR_DESCRIPTOR
;
255 typedef struct _HEAP_ENTRY_EXTRA
261 USHORT AllocatorBackTraceIndex
;
267 } HEAP_ENTRY_EXTRA
, *PHEAP_ENTRY_EXTRA
;
269 typedef HEAP_ENTRY_EXTRA HEAP_FREE_ENTRY_EXTRA
, *PHEAP_FREE_ENTRY_EXTRA
;
271 typedef struct _HEAP_VIRTUAL_ALLOC_ENTRY
274 HEAP_ENTRY_EXTRA ExtraStuff
;
277 HEAP_ENTRY BusyBlock
;
278 } HEAP_VIRTUAL_ALLOC_ENTRY
, *PHEAP_VIRTUAL_ALLOC_ENTRY
;
280 /* Global variables */
281 extern HEAP_LOCK RtlpProcessHeapsListLock
;
282 extern BOOLEAN RtlpPageHeapEnabled
;
284 /* Functions declarations */
287 PHEAP_FREE_ENTRY NTAPI
288 RtlpCoalesceFreeBlocks (PHEAP Heap
,
289 PHEAP_FREE_ENTRY FreeEntry
,
293 PHEAP_ENTRY_EXTRA NTAPI
294 RtlpGetExtraStuffPointer(PHEAP_ENTRY HeapEntry
);
298 RtlpPageHeapCreate(ULONG Flags
,
303 PRTL_HEAP_PARAMETERS Parameters
);