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
;
184 ULONG CompatibilityFlags
;
185 ULONG EncodeFlagMask
;
189 ULONG VirtualMemoryThreshold
;
191 ULONG SegmentReserve
;
193 ULONG DeCommitFreeBlockThreshold
;
194 ULONG DeCommitTotalFreeThreshold
;
196 ULONG MaximumAllocationSize
;
197 USHORT ProcessHeapsListIndex
;
198 USHORT HeaderValidateLength
;
199 PVOID HeaderValidateCopy
;
200 USHORT NextAvailableTagIndex
;
201 USHORT MaximumTagIndex
;
202 PHEAP_TAG_ENTRY TagEntries
;
204 LIST_ENTRY UCRSegments
; // FIXME: non-Vista
207 LIST_ENTRY VirtualAllocdBlocks
;
208 LIST_ENTRY SegmentList
;
209 struct _HEAP_SEGMENT
*Segments
[HEAP_SEGMENTS
]; //FIXME: non-Vista
210 USHORT AllocatorBackTraceIndex
;
211 ULONG NonDedicatedListLength
;
214 PHEAP_PSEUDO_TAG_ENTRY PseudoTagEntries
;
215 LIST_ENTRY FreeLists
[HEAP_FREELISTS
]; //FIXME: non-Vista
218 ULONG FreeListsInUseUlong
[HEAP_FREELISTS
/ (sizeof(ULONG
) * 8)]; //FIXME: non-Vista
219 UCHAR FreeListsInUseBytes
[HEAP_FREELISTS
/ (sizeof(UCHAR
) * 8)]; //FIXME: non-Vista
221 PHEAP_LOCK LockVariable
;
222 PRTL_HEAP_COMMIT_ROUTINE CommitRoutine
;
224 USHORT FrontHeapLockCount
;
225 UCHAR FrontEndHeapType
;
226 HEAP_COUNTERS Counters
;
227 HEAP_TUNING_PARAMETERS TuningParameters
;
230 typedef struct _HEAP_SEGMENT
233 ULONG SegmentSignature
;
235 LIST_ENTRY SegmentListEntry
;
239 PHEAP_ENTRY FirstEntry
;
240 PHEAP_ENTRY LastValidEntry
;
241 ULONG NumberOfUnCommittedPages
;
242 ULONG NumberOfUnCommittedRanges
;
243 USHORT SegmentAllocatorBackTraceIndex
;
245 LIST_ENTRY UCRSegmentList
;
246 PHEAP_ENTRY LastEntryInSegment
; //FIXME: non-Vista
247 } HEAP_SEGMENT
, *PHEAP_SEGMENT
;
249 typedef struct _HEAP_UCR_DESCRIPTOR
251 LIST_ENTRY ListEntry
;
252 LIST_ENTRY SegmentEntry
;
255 } HEAP_UCR_DESCRIPTOR
, *PHEAP_UCR_DESCRIPTOR
;
257 typedef struct _HEAP_UCR_SEGMENT
259 LIST_ENTRY ListEntry
;
261 SIZE_T CommittedSize
;
262 } HEAP_UCR_SEGMENT
, *PHEAP_UCR_SEGMENT
;
264 typedef struct _HEAP_ENTRY_EXTRA
270 USHORT AllocatorBackTraceIndex
;
276 } HEAP_ENTRY_EXTRA
, *PHEAP_ENTRY_EXTRA
;
278 typedef HEAP_ENTRY_EXTRA HEAP_FREE_ENTRY_EXTRA
, *PHEAP_FREE_ENTRY_EXTRA
;
280 typedef struct _HEAP_VIRTUAL_ALLOC_ENTRY
283 HEAP_ENTRY_EXTRA ExtraStuff
;
286 HEAP_ENTRY BusyBlock
;
287 } HEAP_VIRTUAL_ALLOC_ENTRY
, *PHEAP_VIRTUAL_ALLOC_ENTRY
;
289 /* Global variables */
290 extern HEAP_LOCK RtlpProcessHeapsListLock
;
291 extern BOOLEAN RtlpPageHeapEnabled
;
293 /* Functions declarations */
296 PHEAP_FREE_ENTRY NTAPI
297 RtlpCoalesceFreeBlocks (PHEAP Heap
,
298 PHEAP_FREE_ENTRY FreeEntry
,
302 PHEAP_ENTRY_EXTRA NTAPI
303 RtlpGetExtraStuffPointer(PHEAP_ENTRY HeapEntry
);
307 RtlpPageHeapCreate(ULONG Flags
,
312 PRTL_HEAP_PARAMETERS Parameters
);