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.
11 #pragma pack(push,_CRT_PACKING)
13 #ifndef _MM_MALLOC_H_INCLUDED
14 #define _MM_MALLOC_H_INCLUDED
22 #define _HEAP_MAXREQ 0xFFFFFFFFFFFFFFE0
24 #define _HEAP_MAXREQ 0xFFFFFFE0
27 #ifndef _STATIC_ASSERT
28 #define _STATIC_ASSERT(expr) extern void __static_assert_t(int [(expr)?1:-1])
31 /* Return codes for _heapwalk() */
32 #define _HEAPEMPTY (-1)
34 #define _HEAPBADBEGIN (-3)
35 #define _HEAPBADNODE (-4)
37 #define _HEAPBADPTR (-6)
39 /* Values for _heapinfo.useflag */
43 #ifndef _HEAPINFO_DEFINED
44 #define _HEAPINFO_DEFINED
45 /* The structure used to walk through the heap with _heapwalk. */
46 typedef struct _heapinfo
{
53 extern unsigned int _amblksiz
;
55 #define _mm_free(a) _aligned_free(a)
56 #define _mm_malloc(a,b) _aligned_malloc(a,b)
58 #ifndef _CRT_ALLOCATION_DEFINED
59 #define _CRT_ALLOCATION_DEFINED
60 void *__cdecl
calloc(size_t _NumOfElements
,size_t _SizeOfElements
);
61 void __cdecl
free(void *_Memory
);
62 void *__cdecl
malloc(size_t _Size
);
63 void *__cdecl
realloc(void *_Memory
,size_t _NewSize
);
64 _CRTIMP
void *__cdecl
_recalloc(void *_Memory
,size_t _Count
,size_t _Size
);
65 /* _CRTIMP void __cdecl _aligned_free(void *_Memory);
66 _CRTIMP void *__cdecl _aligned_malloc(size_t _Size,size_t _Alignment); */
67 _CRTIMP
void *__cdecl
_aligned_offset_malloc(size_t _Size
,size_t _Alignment
,size_t _Offset
);
68 _CRTIMP
void *__cdecl
_aligned_realloc(void *_Memory
,size_t _Size
,size_t _Alignment
);
69 _CRTIMP
void *__cdecl
_aligned_recalloc(void *_Memory
,size_t _Count
,size_t _Size
,size_t _Alignment
);
70 _CRTIMP
void *__cdecl
_aligned_offset_realloc(void *_Memory
,size_t _Size
,size_t _Alignment
,size_t _Offset
);
71 _CRTIMP
void *__cdecl
_aligned_offset_recalloc(void *_Memory
,size_t _Count
,size_t _Size
,size_t _Alignment
,size_t _Offset
);
74 #define _MAX_WAIT_MALLOC_CRT 60000
76 _CRTIMP
int __cdecl
_resetstkoflw (void);
77 _CRTIMP
unsigned long __cdecl
_set_malloc_crt_max_wait(unsigned long _NewValue
);
79 _CRTIMP
void *__cdecl
_expand(void *_Memory
,size_t _NewSize
);
80 _CRTIMP
size_t __cdecl
_msize(void *_Memory
);
83 #define _alloca(x) __builtin_alloca((x))
85 void *__cdecl
_alloca(size_t _Size
);
87 _CRTIMP
size_t __cdecl
_get_sbh_threshold(void);
88 _CRTIMP
int __cdecl
_set_sbh_threshold(size_t _NewValue
);
89 _CRTIMP errno_t __cdecl
_set_amblksiz(size_t _Value
);
90 _CRTIMP errno_t __cdecl
_get_amblksiz(size_t *_Value
);
91 _CRTIMP
int __cdecl
_heapadd(void *_Memory
,size_t _Size
);
92 _CRTIMP
int __cdecl
_heapchk(void);
93 _CRTIMP
int __cdecl
_heapmin(void);
94 _CRTIMP
int __cdecl
_heapset(unsigned int _Fill
);
95 _CRTIMP
int __cdecl
_heapwalk(_HEAPINFO
*_EntryInfo
);
96 _CRTIMP
size_t __cdecl
_heapused(size_t *_Used
,size_t *_Commit
);
97 _CRTIMP
intptr_t __cdecl
_get_heap_handle(void);
99 #define _ALLOCA_S_THRESHOLD 1024
100 #define _ALLOCA_S_STACK_MARKER 0xCCCC
101 #define _ALLOCA_S_HEAP_MARKER 0xDDDD
103 #if(defined(_X86_) && !defined(__x86_64))
104 #define _ALLOCA_S_MARKER_SIZE 8
105 #elif defined(__ia64__) || defined(__x86_64)
106 #define _ALLOCA_S_MARKER_SIZE 16
109 #if !defined(RC_INVOKED)
110 static __inline
void *_MarkAllocaS(void *_Ptr
,unsigned int _Marker
) {
112 *((unsigned int*)_Ptr
) = _Marker
;
113 _Ptr
= (char*)_Ptr
+ _ALLOCA_S_MARKER_SIZE
;
120 #define _malloca(size) \
121 ((((size) + _ALLOCA_S_MARKER_SIZE) <= _ALLOCA_S_THRESHOLD) ? \
122 _MarkAllocaS(_alloca((size) + _ALLOCA_S_MARKER_SIZE),_ALLOCA_S_STACK_MARKER) : \
123 _MarkAllocaS(malloc((size) + _ALLOCA_S_MARKER_SIZE),_ALLOCA_S_HEAP_MARKER))
125 #define _FREEA_INLINE
129 static __inline
void __cdecl
_freea(void *_Memory
) {
130 unsigned int _Marker
;
132 _Memory
= (char*)_Memory
- _ALLOCA_S_MARKER_SIZE
;
133 _Marker
= *(unsigned int *)_Memory
;
134 if(_Marker
==_ALLOCA_S_HEAP_MARKER
) {
138 else if(_Marker
!=_ALLOCA_S_STACK_MARKER
) {
139 _ASSERTE(("Corrupted pointer passed to _freea",0));
144 #endif /* RC_INVOKED */
149 #define alloca(x) __builtin_alloca((x))
154 #ifndef _HEAPHOOK_DEFINED
155 #define _HEAPHOOK_DEFINED
156 typedef int (__cdecl
*_HEAPHOOK
)(int,size_t,void *,void **);
159 _CRTIMP _HEAPHOOK __cdecl
_setheaphook(_HEAPHOOK _NewHook
);
161 #define _HEAP_MALLOC 1
162 #define _HEAP_CALLOC 2
164 #define _HEAP_REALLOC 4
165 #define _HEAP_MSIZE 5
166 #define _HEAP_EXPAND 6
175 #endif /* _MALLOC_H_ */