Reactos
1/**
2 * This file has no copyright assigned and is placed in the Public Domain.
3 * This file is part of the w64 mingw-runtime package.
4 * No warranty is given; refer to the file DISCLAIMER within this package.
5 */
6#ifndef _INC_MALLOC
7#define _INC_MALLOC
8
9#include <corecrt.h>
10
11#pragma pack(push,_CRT_PACKING)
12
13#ifndef _MM_MALLOC_H_INCLUDED
14#define _MM_MALLOC_H_INCLUDED
15#endif
16
17#ifdef __cplusplus
18extern "C" {
19#endif
20
21#ifdef _WIN64
22#define _HEAP_MAXREQ 0xFFFFFFFFFFFFFFE0
23#else
24#define _HEAP_MAXREQ 0xFFFFFFE0
25#endif
26
27/* Return codes for _heapwalk() */
28#define _HEAPEMPTY (-1)
29#define _HEAPOK (-2)
30#define _HEAPBADBEGIN (-3)
31#define _HEAPBADNODE (-4)
32#define _HEAPEND (-5)
33#define _HEAPBADPTR (-6)
34
35/* Values for _heapinfo.useflag */
36#define _FREEENTRY 0
37#define _USEDENTRY 1
38
39#ifndef _HEAPINFO_DEFINED
40#define _HEAPINFO_DEFINED
41 /* The structure used to walk through the heap with _heapwalk. */
42 typedef struct _heapinfo {
43 int *_pentry;
44 size_t _size;
45 int _useflag;
46 } _HEAPINFO;
47#endif
48
49 extern unsigned int _amblksiz;
50
51/* Make sure that X86intrin.h doesn't produce here collisions. */
52#if (!defined (_XMMINTRIN_H_INCLUDED) && !defined (_MM_MALLOC_H_INCLUDED)) || defined(_aligned_malloc)
53#define __DO_ALIGN_DEFINES
54#endif
55
56#ifdef __DO_ALIGN_DEFINES
57#pragma push_macro("_aligned_free")
58#pragma push_macro("_aligned_malloc")
59#undef _aligned_free
60#undef _aligned_malloc
61#endif
62
63#define _mm_free(a) _aligned_free(a)
64#define _mm_malloc(a,b) _aligned_malloc(a,b)
65
66#ifndef _CRT_ALLOCATION_DEFINED
67#define _CRT_ALLOCATION_DEFINED
68
69 _Check_return_
70 _Ret_maybenull_
71 _Post_writable_byte_size_(_NumOfElements * _SizeOfElements)
72 void*
73 __cdecl
74 calloc(
75 _In_ size_t _NumOfElements,
76 _In_ size_t _SizeOfElements);
77
78 void
79 __cdecl
80 free(
81 _Pre_maybenull_ _Post_invalid_ void *_Memory);
82
83 _Check_return_
84 _Ret_maybenull_
85 _Post_writable_byte_size_(_Size)
86 void*
87 __cdecl
88 malloc(
89 _In_ size_t _Size);
90
91 _Check_return_
92 _Ret_maybenull_
93 _Post_writable_byte_size_(_NewSize)
94 void*
95 __cdecl
96 realloc(
97 _Pre_maybenull_ _Post_invalid_ void *_Memory,
98 _In_ size_t _NewSize);
99
100 _Check_return_
101 _Ret_maybenull_
102 _Post_writable_byte_size_(_Count * _Size)
103 _CRTIMP
104 void*
105 __cdecl
106 _recalloc(
107 _Pre_maybenull_ _Post_invalid_ void *_Memory,
108 _In_ size_t _Count,
109 _In_ size_t _Size);
110
111#ifdef __DO_ALIGN_DEFINES
112
113 _CRTIMP
114 void
115 __cdecl
116 _aligned_free(
117 _Pre_maybenull_ _Post_invalid_ void *_Memory);
118
119 _Check_return_
120 _Ret_maybenull_
121 _Post_writable_byte_size_(_Size)
122 _CRTIMP
123 void*
124 __cdecl
125 _aligned_malloc(
126 _In_ size_t _Size,
127 _In_ size_t _Alignment);
128
129#endif /* __DO_ALIGN_DEFINES */
130
131 _Check_return_
132 _Ret_maybenull_
133 _Post_writable_byte_size_(_Size)
134 _CRTIMP
135 void*
136 __cdecl
137 _aligned_offset_malloc(
138 _In_ size_t _Size,
139 _In_ size_t _Alignment,
140 _In_ size_t _Offset);
141
142 _Check_return_
143 _Ret_maybenull_
144 _Post_writable_byte_size_(_Size)
145 _CRTIMP
146 void*
147 __cdecl
148 _aligned_realloc(
149 _Pre_maybenull_ _Post_invalid_ void *_Memory,
150 _In_ size_t _Size,
151 _In_ size_t _Alignment);
152
153 _Check_return_
154 _Ret_maybenull_
155 _Post_writable_byte_size_(_Count * _Size)
156 _CRTIMP
157 void*
158 __cdecl
159 _aligned_recalloc(
160 _Pre_maybenull_ _Post_invalid_ void *_Memory,
161 _In_ size_t _Count,
162 _In_ size_t _Size,
163 _In_ size_t _Alignment);
164
165 _Check_return_
166 _Ret_maybenull_
167 _Post_writable_byte_size_(_Size)
168 _CRTIMP
169 void*
170 __cdecl
171 _aligned_offset_realloc(
172 _Pre_maybenull_ _Post_invalid_ void *_Memory,
173 _In_ size_t _Size,
174 _In_ size_t _Alignment,
175 _In_ size_t _Offset);
176
177 _Check_return_
178 _Ret_maybenull_
179 _Post_writable_byte_size_(_Count * _Size)
180 _CRTIMP
181 void*
182 __cdecl
183 _aligned_offset_recalloc(
184 _Pre_maybenull_ _Post_invalid_ void *_Memory,
185 _In_ size_t _Count,
186 _In_ size_t _Size,
187 _In_ size_t _Alignment,
188 _In_ size_t _Offset);
189
190#endif /* _CRT_ALLOCATION_DEFINED */
191
192#ifdef __DO_ALIGN_DEFINES
193#undef __DO_ALIGN_DEFINES
194
195#pragma pop_macro("_aligned_malloc")
196#pragma pop_macro("_aligned_free")
197
198#endif
199
200#define _MAX_WAIT_MALLOC_CRT 60000
201
202 _CRTIMP int __cdecl _resetstkoflw (void);
203
204 _CRTIMP
205 unsigned long
206 __cdecl
207 _set_malloc_crt_max_wait(
208 _In_ unsigned long _NewValue);
209
210 _Check_return_
211 _Ret_maybenull_
212 _Post_writable_byte_size_(_NewSize)
213 _CRTIMP
214 void*
215 __cdecl
216 _expand(
217 _In_opt_ void *_Memory,
218 _In_ size_t _NewSize);
219
220 _Check_return_
221 _CRTIMP
222 size_t
223 __cdecl
224 _msize(
225 _In_ void *_Memory);
226
227#ifdef __GNUC__
228#undef _alloca
229#define _alloca(x) __builtin_alloca((x))
230#else
231 _Ret_notnull_
232 _Post_writable_byte_size_(_Size)
233 void*
234 __cdecl
235 _alloca(
236 _In_ size_t _Size);
237#endif
238
239 _Check_return_
240 _CRTIMP
241 size_t
242 __cdecl
243 _get_sbh_threshold(void);
244
245 _CRTIMP
246 int
247 __cdecl
248 _set_sbh_threshold(
249 _In_ size_t _NewValue);
250
251 _CRTIMP
252 errno_t
253 __cdecl
254 _set_amblksiz(
255 _In_ size_t _Value);
256
257 _CRTIMP
258 errno_t
259 __cdecl
260 _get_amblksiz(
261 _Out_ size_t *_Value);
262
263 _Check_return_
264 _CRTIMP
265 int
266 __cdecl
267 _heapadd(
268 _In_ void *_Memory,
269 _In_ size_t _Size);
270
271 _Check_return_
272 _CRTIMP
273 int
274 __cdecl
275 _heapchk(void);
276
277 _Check_return_
278 _CRTIMP
279 int
280 __cdecl
281 _heapmin(void);
282
283 _CRTIMP
284 int
285 __cdecl
286 _heapset(
287 _In_ unsigned int _Fill);
288
289 _CRTIMP
290 int
291 __cdecl
292 _heapwalk(
293 _Inout_ _HEAPINFO *_EntryInfo);
294
295 _CRTIMP
296 size_t
297 __cdecl
298 _heapused(
299 size_t *_Used,
300 size_t *_Commit);
301
302 _CRTIMP
303 intptr_t
304 __cdecl
305 _get_heap_handle(void);
306
307#define _ALLOCA_S_THRESHOLD 1024
308#define _ALLOCA_S_STACK_MARKER 0xCCCC
309#define _ALLOCA_S_HEAP_MARKER 0xDDDD
310
311#if(defined(_X86_) && !defined(__x86_64))
312#define _ALLOCA_S_MARKER_SIZE 8
313#elif defined(__ia64__) || defined(__x86_64) || defined(__arm64__)
314#define _ALLOCA_S_MARKER_SIZE 16
315#elif defined(__arm__)
316#define _ALLOCA_S_MARKER_SIZE 8
317#endif
318
319#if !defined(RC_INVOKED)
320 static __inline void *_MarkAllocaS(void *_Ptr,unsigned int _Marker) {
321 if(_Ptr) {
322 *((unsigned int*)_Ptr) = _Marker;
323 _Ptr = (char*)_Ptr + _ALLOCA_S_MARKER_SIZE;
324 }
325 return _Ptr;
326 }
327#endif
328
329#undef _malloca
330#define _malloca(size) \
331 ((((size) + _ALLOCA_S_MARKER_SIZE) <= _ALLOCA_S_THRESHOLD) ? \
332 _MarkAllocaS(_alloca((size) + _ALLOCA_S_MARKER_SIZE),_ALLOCA_S_STACK_MARKER) : \
333 _MarkAllocaS(malloc((size) + _ALLOCA_S_MARKER_SIZE),_ALLOCA_S_HEAP_MARKER))
334#undef _FREEA_INLINE
335#define _FREEA_INLINE
336
337#ifndef RC_INVOKED
338#undef _freea
339 static __inline void __cdecl _freea(void *_Memory) {
340 unsigned int _Marker;
341 if(_Memory) {
342 _Memory = (char*)_Memory - _ALLOCA_S_MARKER_SIZE;
343 _Marker = *(unsigned int *)_Memory;
344 if(_Marker==_ALLOCA_S_HEAP_MARKER) {
345 free(_Memory);
346 }
347#ifdef _ASSERTE
348 else if(_Marker!=_ALLOCA_S_STACK_MARKER) {
349 _ASSERTE(("Corrupted pointer passed to _freea",0));
350 }
351#endif
352 }
353 }
354#endif /* RC_INVOKED */
355
356#ifndef NO_OLDNAMES
357#define alloca _alloca
358#endif
359
360#ifdef HEAPHOOK
361#ifndef _HEAPHOOK_DEFINED
362#define _HEAPHOOK_DEFINED
363 typedef int (__cdecl *_HEAPHOOK)(int,size_t,void *,void **);
364#endif
365
366 _CRTIMP
367 _HEAPHOOK
368 __cdecl
369 _setheaphook(
370 _In_opt_ _HEAPHOOK _NewHook);
371
372#define _HEAP_MALLOC 1
373#define _HEAP_CALLOC 2
374#define _HEAP_FREE 3
375#define _HEAP_REALLOC 4
376#define _HEAP_MSIZE 5
377#define _HEAP_EXPAND 6
378#endif
379
380#ifdef __cplusplus
381}
382#endif
383
384#pragma pack(pop)
385
386#endif /* _INC_MALLOC */