293 lines
10 KiB
C
293 lines
10 KiB
C
/***
|
|
*malloc.h - declarations and definitions for memory allocation functions
|
|
*
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
*
|
|
*Purpose:
|
|
* Contains the function declarations for memory allocation functions;
|
|
* also defines manifest constants and types used by the heap routines.
|
|
* [System V]
|
|
*
|
|
* [Public]
|
|
*
|
|
****/
|
|
|
|
#if _MSC_VER > 1000
|
|
#pragma once
|
|
#endif
|
|
|
|
#ifndef _INC_MALLOC
|
|
#define _INC_MALLOC
|
|
|
|
#include <crtdefs.h>
|
|
|
|
#ifdef _MSC_VER
|
|
/*
|
|
* Currently, all MS C compilers for Win32 platforms default to 8 byte
|
|
* alignment.
|
|
*/
|
|
#pragma pack(push,_CRT_PACKING)
|
|
#endif /* _MSC_VER */
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* Maximum heap request the heap manager will attempt */
|
|
|
|
#ifdef _WIN64
|
|
#define _HEAP_MAXREQ 0xFFFFFFFFFFFFFFE0
|
|
#else
|
|
#define _HEAP_MAXREQ 0xFFFFFFE0
|
|
#endif
|
|
|
|
/* _STATIC_ASSERT is for enforcing boolean/integral conditions at compile time. */
|
|
|
|
#ifndef _STATIC_ASSERT
|
|
#define _STATIC_ASSERT(expr) typedef char __static_assert_t[ (expr) ]
|
|
#endif
|
|
|
|
/* Constants for _heapchk/_heapset/_heapwalk routines */
|
|
|
|
#define _HEAPEMPTY (-1)
|
|
#define _HEAPOK (-2)
|
|
#define _HEAPBADBEGIN (-3)
|
|
#define _HEAPBADNODE (-4)
|
|
#define _HEAPEND (-5)
|
|
#define _HEAPBADPTR (-6)
|
|
#define _FREEENTRY 0
|
|
#define _USEDENTRY 1
|
|
|
|
#ifndef _HEAPINFO_DEFINED
|
|
typedef struct _heapinfo {
|
|
int * _pentry;
|
|
size_t _size;
|
|
int _useflag;
|
|
} _HEAPINFO;
|
|
#define _HEAPINFO_DEFINED
|
|
#endif
|
|
|
|
/* External variable declarations */
|
|
|
|
#if !defined(_M_CEE_PURE)
|
|
extern _CRT_INSECURE_DEPRECATE_GLOBALS(_get_amblksiz) unsigned int _amblksiz;
|
|
#else
|
|
_CRT_INSECURE_DEPRECATE_GLOBALS(_get_amblksiz) _CRTIMP unsigned int * __cdecl __p__amblksiz(void);
|
|
#define _amblksiz (*__p__amblksiz())
|
|
#endif /* !defined(_M_CEE_PURE) */
|
|
|
|
#define _mm_free(a) _aligned_free(a)
|
|
#define _mm_malloc(a, b) _aligned_malloc(a, b)
|
|
|
|
/* Function prototypes */
|
|
|
|
#if defined(_DEBUG) && defined(_CRTDBG_MAP_ALLOC)
|
|
#pragma push_macro("calloc")
|
|
#pragma push_macro("free")
|
|
#pragma push_macro("malloc")
|
|
#pragma push_macro("realloc")
|
|
#pragma push_macro("_recalloc")
|
|
#pragma push_macro("_aligned_free")
|
|
#pragma push_macro("_aligned_malloc")
|
|
#pragma push_macro("_aligned_offset_malloc")
|
|
#pragma push_macro("_aligned_realloc")
|
|
#pragma push_macro("_aligned_recalloc")
|
|
#pragma push_macro("_aligned_offset_realloc")
|
|
#pragma push_macro("_aligned_offset_recalloc")
|
|
#pragma push_macro("_aligned_msize")
|
|
#pragma push_macro("_freea")
|
|
#undef calloc
|
|
#undef free
|
|
#undef malloc
|
|
#undef realloc
|
|
#undef _recalloc
|
|
#undef _aligned_free
|
|
#undef _aligned_malloc
|
|
#undef _aligned_offset_malloc
|
|
#undef _aligned_realloc
|
|
#undef _aligned_recalloc
|
|
#undef _aligned_offset_realloc
|
|
#undef _aligned_offset_recalloc
|
|
#undef _aligned_msize
|
|
#undef _freea
|
|
#endif
|
|
|
|
#ifndef _CRT_ALLOCATION_DEFINED
|
|
#define _CRT_ALLOCATION_DEFINED
|
|
_CRTIMP _CRT_JIT_INTRINSIC _CRTNOALIAS _CRTRESTRICT __checkReturn __bcount_opt(_NumOfElements* _SizeOfElements) void * __cdecl calloc(__in size_t _NumOfElements, __in size_t _SizeOfElements);
|
|
_CRTIMP _CRTNOALIAS void __cdecl free(__inout_opt void * _Memory);
|
|
_CRTIMP _CRT_JIT_INTRINSIC _CRTNOALIAS _CRTRESTRICT __checkReturn __bcount_opt(_Size) void * __cdecl malloc(__in size_t _Size);
|
|
_CRTIMP _CRTNOALIAS _CRTRESTRICT __checkReturn __bcount_opt(_NewSize) void * __cdecl realloc(__in_opt void * _Memory, __in size_t _NewSize);
|
|
_CRTIMP _CRTNOALIAS _CRTRESTRICT __checkReturn __bcount_opt(_Size*_Count) void * __cdecl _recalloc(__in_opt void * _Memory, __in size_t _Count, __in size_t _Size);
|
|
_CRTIMP _CRTNOALIAS void __cdecl _aligned_free(__inout_opt void * _Memory);
|
|
_CRTIMP _CRTNOALIAS _CRTRESTRICT __checkReturn __bcount_opt(_Size) void * __cdecl _aligned_malloc(__in size_t _Size, __in size_t _Alignment);
|
|
_CRTIMP _CRTNOALIAS _CRTRESTRICT __checkReturn __bcount_opt(_Size) void * __cdecl _aligned_offset_malloc(__in size_t _Size, __in size_t _Alignment, __in size_t _Offset);
|
|
_CRTIMP _CRTNOALIAS _CRTRESTRICT __checkReturn __bcount_opt(_Size) void * __cdecl _aligned_realloc(__in_opt void * _Memory, __in size_t _Size, __in size_t _Alignment);
|
|
_CRTIMP _CRTNOALIAS _CRTRESTRICT __checkReturn __bcount_opt(_Size*_Count) void * __cdecl _aligned_recalloc(__in_opt void * _Memory, __in size_t _Count, __in size_t _Size, __in size_t _Alignment);
|
|
_CRTIMP _CRTNOALIAS _CRTRESTRICT __checkReturn __bcount_opt(_Size) void * __cdecl _aligned_offset_realloc(__in_opt void * _Memory, __in size_t _Size, __in size_t _Alignment, __in size_t _Offset);
|
|
_CRTIMP _CRTNOALIAS _CRTRESTRICT __checkReturn __bcount_opt(_Size*_Count) void * __cdecl _aligned_offset_recalloc(__in_opt void * _Memory, __in size_t _Count, __in size_t _Size, __in size_t _Alignment, __in size_t _Offset);
|
|
_CRTIMP __checkReturn size_t __cdecl _aligned_msize(__in void * _Memory, __in size_t _Alignment, __in size_t _Offset);
|
|
#endif
|
|
|
|
#if defined(_DEBUG) && defined(_CRTDBG_MAP_ALLOC)
|
|
#pragma pop_macro("calloc")
|
|
#pragma pop_macro("free")
|
|
#pragma pop_macro("malloc")
|
|
#pragma pop_macro("realloc")
|
|
#pragma pop_macro("_recalloc")
|
|
#pragma pop_macro("_aligned_free")
|
|
#pragma pop_macro("_aligned_malloc")
|
|
#pragma pop_macro("_aligned_offset_malloc")
|
|
#pragma pop_macro("_aligned_realloc")
|
|
#pragma pop_macro("_aligned_recalloc")
|
|
#pragma pop_macro("_aligned_offset_realloc")
|
|
#pragma pop_macro("_aligned_offset_recalloc")
|
|
#pragma pop_macro("_aligned_msize")
|
|
#pragma pop_macro("_freea")
|
|
#endif
|
|
|
|
_CRTIMP int __cdecl _resetstkoflw (void);
|
|
|
|
#define _MAX_WAIT_MALLOC_CRT 60000
|
|
|
|
_CRTIMP unsigned long __cdecl _set_malloc_crt_max_wait(__in unsigned long _NewValue);
|
|
|
|
#ifndef _POSIX_
|
|
|
|
#if defined(_DEBUG) && defined(_CRTDBG_MAP_ALLOC)
|
|
#pragma push_macro("_expand")
|
|
#pragma push_macro("_msize")
|
|
#undef _expand
|
|
#undef _msize
|
|
#endif
|
|
|
|
_CRTIMP __checkReturn __bcount_opt(_NewSize) void * __cdecl _expand(__in void * _Memory, __in size_t _NewSize);
|
|
_CRTIMP __checkReturn size_t __cdecl _msize(__in void * _Memory);
|
|
|
|
#if defined(_DEBUG) && defined(_CRTDBG_MAP_ALLOC)
|
|
#pragma pop_macro("_expand")
|
|
#pragma pop_macro("_msize")
|
|
#endif
|
|
|
|
__checkReturn __bcount(_Size) void * __cdecl _alloca(__in size_t _Size);
|
|
_CRTIMP __checkReturn size_t __cdecl _get_sbh_threshold(void);
|
|
_CRTIMP int __cdecl _set_sbh_threshold(__in size_t _NewValue);
|
|
_CRTIMP errno_t __cdecl _set_amblksiz(__in size_t _Value);
|
|
_CRTIMP errno_t __cdecl _get_amblksiz(__out size_t * _Value);
|
|
_CRTIMP __checkReturn int __cdecl _heapadd(__in void * _Memory, __in size_t _Size);
|
|
_CRTIMP __checkReturn int __cdecl _heapchk(void);
|
|
_CRTIMP __checkReturn int __cdecl _heapmin(void);
|
|
_CRTIMP int __cdecl _heapset(__in unsigned int _Fill);
|
|
_CRTIMP _CRT_MANAGED_HEAP_DEPRECATE int __cdecl _heapwalk(__inout _HEAPINFO * _EntryInfo);
|
|
_CRTIMP size_t __cdecl _heapused(size_t * _Used, size_t * _Commit);
|
|
|
|
_CRTIMP intptr_t __cdecl _get_heap_handle(void);
|
|
|
|
#define _ALLOCA_S_THRESHOLD 1024
|
|
#define _ALLOCA_S_STACK_MARKER 0xCCCC
|
|
#define _ALLOCA_S_HEAP_MARKER 0xDDDD
|
|
|
|
#if defined(_M_IX86)
|
|
#define _ALLOCA_S_MARKER_SIZE 8
|
|
#elif defined(_M_IA64)
|
|
#define _ALLOCA_S_MARKER_SIZE 16
|
|
#elif defined(_M_AMD64)
|
|
#define _ALLOCA_S_MARKER_SIZE 16
|
|
#endif
|
|
|
|
_STATIC_ASSERT(sizeof(unsigned int) <= _ALLOCA_S_MARKER_SIZE);
|
|
|
|
#if !defined(__midl) && !defined(RC_INVOKED)
|
|
__inline void *_MarkAllocaS(__out_opt __crt_typefix(unsigned int*) void *_Ptr, unsigned int _Marker)
|
|
{
|
|
if (_Ptr)
|
|
{
|
|
*((unsigned int*)_Ptr) = _Marker;
|
|
_Ptr = (char*)_Ptr + _ALLOCA_S_MARKER_SIZE;
|
|
}
|
|
return _Ptr;
|
|
}
|
|
#endif
|
|
|
|
#if defined(_DEBUG)
|
|
#if !defined(_CRTDBG_MAP_ALLOC)
|
|
#undef _malloca
|
|
#define _malloca(size) \
|
|
__pragma(warning(suppress: 6255)) \
|
|
_MarkAllocaS(malloc((size) + _ALLOCA_S_MARKER_SIZE), _ALLOCA_S_HEAP_MARKER)
|
|
#endif
|
|
#else
|
|
#undef _malloca
|
|
#define _malloca(size) \
|
|
__pragma(warning(suppress: 6255)) \
|
|
((((size) + _ALLOCA_S_MARKER_SIZE) <= _ALLOCA_S_THRESHOLD) ? \
|
|
_MarkAllocaS(_alloca((size) + _ALLOCA_S_MARKER_SIZE), _ALLOCA_S_STACK_MARKER) : \
|
|
_MarkAllocaS(malloc((size) + _ALLOCA_S_MARKER_SIZE), _ALLOCA_S_HEAP_MARKER))
|
|
#endif
|
|
|
|
#undef _FREEA_INLINE
|
|
#define _FREEA_INLINE
|
|
|
|
#ifdef _FREEA_INLINE
|
|
/* _freea must be in the header so that its allocator matches _malloca */
|
|
#if !defined(__midl) && !defined(RC_INVOKED)
|
|
#undef _freea
|
|
_CRTNOALIAS __inline void __CRTDECL _freea(__inout_opt void * _Memory)
|
|
{
|
|
unsigned int _Marker;
|
|
if (_Memory)
|
|
{
|
|
_Memory = (char*)_Memory - _ALLOCA_S_MARKER_SIZE;
|
|
_Marker = *(unsigned int *)_Memory;
|
|
if (_Marker == _ALLOCA_S_HEAP_MARKER)
|
|
{
|
|
free(_Memory);
|
|
}
|
|
#if defined(_ASSERTE)
|
|
else if (_Marker != _ALLOCA_S_STACK_MARKER)
|
|
{
|
|
_ASSERTE(("Corrupted pointer passed to _freea", 0));
|
|
}
|
|
#endif
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
#if !__STDC__
|
|
/* Non-ANSI names for compatibility */
|
|
#define alloca _alloca
|
|
#endif /* __STDC__*/
|
|
|
|
#endif /* _POSIX_ */
|
|
|
|
#ifdef HEAPHOOK
|
|
#ifndef _HEAPHOOK_DEFINED
|
|
/* hook function type */
|
|
typedef int (__cdecl * _HEAPHOOK)(int, size_t, void *, void **);
|
|
#define _HEAPHOOK_DEFINED
|
|
#endif /* _HEAPHOOK_DEFINED */
|
|
|
|
/* set hook function */
|
|
_CRTIMP _HEAPHOOK __cdecl _setheaphook(__in_opt _HEAPHOOK _NewHook);
|
|
|
|
/* hook function must handle these types */
|
|
#define _HEAP_MALLOC 1
|
|
#define _HEAP_CALLOC 2
|
|
#define _HEAP_FREE 3
|
|
#define _HEAP_REALLOC 4
|
|
#define _HEAP_MSIZE 5
|
|
#define _HEAP_EXPAND 6
|
|
#endif /* HEAPHOOK */
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#ifdef _MSC_VER
|
|
#pragma pack(pop)
|
|
#endif /* _MSC_VER */
|
|
|
|
#endif /* _INC_MALLOC */
|