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))
19 #define HEAP_ENTRY_SHIFT 3
20 #define HEAP_MAX_BLOCK_SIZE ((0x80000 - PAGE_SIZE) >> HEAP_ENTRY_SHIFT)
22 #define ARENA_INUSE_FILLER 0xBAADF00D
23 #define ARENA_FREE_FILLER 0xFEEEFEEE
24 #define HEAP_TAIL_FILL 0xab
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)
31 #define HEAP_EXTRA_FLAGS_MASK (HEAP_CAPTURE_STACK_BACKTRACES | \
32 HEAP_SETTABLE_USER_VALUE | \
33 (HEAP_TAG_MASK ^ (0xFF << HEAP_TAG_SHIFT)))
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)
47 #define HEAP_SIGNATURE 0xeefeeff
48 #define HEAP_SEGMENT_SIGNATURE 0xffeeffee
51 #define HEAP_USER_ALLOCATED 0x1
54 struct _HEAP_COMMON_ENTRY
82 ULONG InterceptorValue
;
83 USHORT UnusedBytesLength
;
85 UCHAR ExtendedBlockSignature
;
94 ULONGLONG AgregateCode
;
98 typedef struct _HEAP_FREE_ENTRY
100 struct _HEAP_COMMON_ENTRY
;
102 } HEAP_FREE_ENTRY
, *PHEAP_FREE_ENTRY
;
104 typedef struct _HEAP_ENTRY
106 struct _HEAP_COMMON_ENTRY
;
107 } HEAP_ENTRY
, *PHEAP_ENTRY
;
109 C_ASSERT(sizeof(HEAP_ENTRY
) == 8);
110 C_ASSERT((1 << HEAP_ENTRY_SHIFT
) == sizeof(HEAP_ENTRY
));
112 typedef struct _HEAP_TAG_ENTRY
118 USHORT CreatorBackTraceIndex
;
120 } HEAP_TAG_ENTRY
, *PHEAP_TAG_ENTRY
;
122 typedef struct _HEAP_PSEUDO_TAG_ENTRY
127 } HEAP_PSEUDO_TAG_ENTRY
, *PHEAP_PSEUDO_TAG_ENTRY
;
129 typedef struct _HEAP_COUNTERS
131 ULONG TotalMemoryReserved
;
132 ULONG TotalMemoryCommitted
;
133 ULONG TotalMemoryLargeUCR
;
134 ULONG TotalSizeInVirtualBlocks
;
140 ULONG LockCollisions
;
143 ULONG CommitFailures
;
144 ULONG InBlockCommitFailures
;
145 ULONG CompactHeapCalls
;
147 ULONG InBlockDeccommits
;
148 ULONG InBlockDeccomitSize
;
149 } HEAP_COUNTERS
, *PHEAP_COUNTERS
;
151 typedef struct _HEAP_TUNING_PARAMETERS
153 ULONG CommittThresholdShift
;
154 ULONG MaxPreCommittThreshold
;
155 } HEAP_TUNING_PARAMETERS
, *PHEAP_TUNING_PARAMETERS
;
160 ULONG SegmentSignature
;
162 LIST_ENTRY SegmentListEntry
;
166 PHEAP_ENTRY FirstEntry
;
167 PHEAP_ENTRY LastValidEntry
;
168 ULONG NumberOfUnCommittedPages
;
169 ULONG NumberOfUnCommittedRanges
;
170 USHORT SegmentAllocatorBackTraceIndex
;
172 LIST_ENTRY UCRSegmentList
;
175 ULONG CompatibilityFlags
;
176 ULONG EncodeFlagMask
;
180 ULONG VirtualMemoryThreshold
;
182 ULONG SegmentReserve
;
184 ULONG DeCommitFreeBlockThreshold
;
185 ULONG DeCommitTotalFreeThreshold
;
187 ULONG MaximumAllocationSize
;
188 USHORT ProcessHeapsListIndex
;
189 USHORT HeaderValidateLength
;
190 PVOID HeaderValidateCopy
;
191 USHORT NextAvailableTagIndex
;
192 USHORT MaximumTagIndex
;
193 PHEAP_TAG_ENTRY TagEntries
;
197 LIST_ENTRY VirtualAllocdBlocks
;
198 LIST_ENTRY SegmentList
;
199 struct _HEAP_SEGMENT
*Segments
[HEAP_SEGMENTS
]; //FIXME: non-Vista
200 USHORT AllocatorBackTraceIndex
;
201 ULONG NonDedicatedListLength
;
204 PHEAP_PSEUDO_TAG_ENTRY PseudoTagEntries
;
205 LIST_ENTRY FreeLists
[HEAP_FREELISTS
]; //FIXME: non-Vista
208 ULONG FreeListsInUseUlong
[HEAP_FREELISTS
/ (sizeof(ULONG
) * 8)]; //FIXME: non-Vista
209 UCHAR FreeListsInUseBytes
[HEAP_FREELISTS
/ (sizeof(UCHAR
) * 8)]; //FIXME: non-Vista
211 PHEAP_LOCK LockVariable
;
212 PRTL_HEAP_COMMIT_ROUTINE CommitRoutine
;
214 USHORT FrontHeapLockCount
;
215 UCHAR FrontEndHeapType
;
216 HEAP_COUNTERS Counters
;
217 HEAP_TUNING_PARAMETERS TuningParameters
;
220 typedef struct _HEAP_SEGMENT
223 ULONG SegmentSignature
;
225 LIST_ENTRY SegmentListEntry
;
229 PHEAP_ENTRY FirstEntry
;
230 PHEAP_ENTRY LastValidEntry
;
231 ULONG NumberOfUnCommittedPages
;
232 ULONG NumberOfUnCommittedRanges
;
233 USHORT SegmentAllocatorBackTraceIndex
;
235 LIST_ENTRY UCRSegmentList
;
236 PHEAP_ENTRY LastEntryInSegment
; //FIXME: non-Vista
237 } HEAP_SEGMENT
, *PHEAP_SEGMENT
;
239 typedef struct _HEAP_UCR_DESCRIPTOR
241 LIST_ENTRY ListEntry
;
242 LIST_ENTRY SegmentEntry
;
245 } HEAP_UCR_DESCRIPTOR
, *PHEAP_UCR_DESCRIPTOR
;
247 typedef struct _HEAP_ENTRY_EXTRA
253 USHORT AllocatorBackTraceIndex
;
259 } HEAP_ENTRY_EXTRA
, *PHEAP_ENTRY_EXTRA
;
261 typedef HEAP_ENTRY_EXTRA HEAP_FREE_ENTRY_EXTRA
, *PHEAP_FREE_ENTRY_EXTRA
;
263 typedef struct _HEAP_VIRTUAL_ALLOC_ENTRY
266 HEAP_ENTRY_EXTRA ExtraStuff
;
269 HEAP_ENTRY BusyBlock
;
270 } HEAP_VIRTUAL_ALLOC_ENTRY
, *PHEAP_VIRTUAL_ALLOC_ENTRY
;
272 /* Global variables */
273 extern HEAP_LOCK RtlpProcessHeapsListLock
;
274 extern BOOLEAN RtlpPageHeapEnabled
;
276 /* Functions declarations */
279 PHEAP_FREE_ENTRY NTAPI
280 RtlpCoalesceFreeBlocks (PHEAP Heap
,
281 PHEAP_FREE_ENTRY FreeEntry
,
285 PHEAP_ENTRY_EXTRA NTAPI
286 RtlpGetExtraStuffPointer(PHEAP_ENTRY HeapEntry
);
290 RtlpPageHeapCreate(ULONG Flags
,
295 PRTL_HEAP_PARAMETERS Parameters
);