aboutsummaryrefslogtreecommitdiffstats
path: root/libsimple/memalloc.h
blob: 9f894e8e83d04a29579bbf1d82668df12516986a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/* See LICENSE file for copyright and license details. */

enum libsimple_memalloc_option {
	LIBSIMPLE_MEMALLOC_END,
	LIBSIMPLE_MEMALLOC_ZERO_INIT,
	LIBSIMPLE_MEMALLOC_CONDITIONAL_ZERO_INIT,
	LIBSIMPLE_MEMALLOC_UNIQUE_IF_ZERO,
	LIBSIMPLE_MEMALLOC_NULL_IF_ZERO,
	LIBSIMPLE_MEMALLOC_ALIGNMENT,
	LIBSIMPLE_MEMALLOC_PAGE_ALIGNMENT,
	LIBSIMPLE_MEMALLOC_ALIGNMENT_TO_CACHE_LINE,
	LIBSIMPLE_MEMALLOC_ALLOW_CACHE_LINE_SPLITTING,
	LIBSIMPLE_MEMALLOC_ROUND_UP_SIZE_TO_ALIGNMENT,
	LIBSIMPLE_MEMALLOC_ELEMENT_SIZE,
	LIBSIMPLE_MEMALLOC_PRODUCT_SIZE,
	LIBSIMPLE_MEMALLOC_VA_PRODUCT_SIZE,
	LIBSIMPLE_MEMALLOC_1_VA_PRODUCT_SIZE,
	LIBSIMPLE_MEMALLOC_VA_LIST
};
#define libsimple_arrayalloc_option libsimple_memalloc_option

#define LIBSIMPLE_MEMALLOC_END                        LIBSIMPLE_MEMALLOC_END
#define LIBSIMPLE_MEMALLOC_ZERO_INIT                  LIBSIMPLE_MEMALLOC_ZERO_INIT
#define LIBSIMPLE_MEMALLOC_CONDITIONAL_ZERO_INIT      LIBSIMPLE_MEMALLOC_CONDITIONAL_ZERO_INIT
#define LIBSIMPLE_MEMALLOC_UNIQUE_IF_ZERO             LIBSIMPLE_MEMALLOC_UNIQUE_IF_ZERO
#define LIBSIMPLE_MEMALLOC_NULL_IF_ZERO               LIBSIMPLE_MEMALLOC_NULL_IF_ZERO
#define LIBSIMPLE_MEMALLOC_ALIGNMENT                  LIBSIMPLE_MEMALLOC_ALIGNMENT
#define LIBSIMPLE_MEMALLOC_PAGE_ALIGNMENT             LIBSIMPLE_MEMALLOC_PAGE_ALIGNMENT
#define LIBSIMPLE_MEMALLOC_ALIGNMENT_TO_CACHE_LINE    LIBSIMPLE_MEMALLOC_ALIGNMENT_TO_CACHE_LINE
#define LIBSIMPLE_MEMALLOC_ALLOW_CACHE_LINE_SPLITTING LIBSIMPLE_MEMALLOC_ALLOW_CACHE_LINE_SPLITTING
#define LIBSIMPLE_MEMALLOC_ROUND_UP_SIZE_TO_ALIGNMENT LIBSIMPLE_MEMALLOC_ROUND_UP_SIZE_TO_ALIGNMENT
#define LIBSIMPLE_MEMALLOC_ELEMENT_SIZE               LIBSIMPLE_MEMALLOC_ELEMENT_SIZE
#define LIBSIMPLE_MEMALLOC_PRODUCT_SIZE               LIBSIMPLE_MEMALLOC_PRODUCT_SIZE
#define LIBSIMPLE_MEMALLOC_VA_PRODUCT_SIZE            LIBSIMPLE_MEMALLOC_VA_PRODUCT_SIZE
#define LIBSIMPLE_MEMALLOC_1_VA_PRODUCT_SIZE          LIBSIMPLE_MEMALLOC_1_VA_PRODUCT_SIZE
#define LIBSIMPLE_MEMALLOC_VA_LIST                    LIBSIMPLE_MEMALLOC_VA_LIST

#define LIBSIMPLE_ARRAYALLOC_END                        LIBSIMPLE_MEMALLOC_END
#define LIBSIMPLE_ARRAYALLOC_ZERO_INIT                  LIBSIMPLE_MEMALLOC_ZERO_INIT
#define LIBSIMPLE_ARRAYALLOC_CONDITIONAL_ZERO_INIT      LIBSIMPLE_MEMALLOC_CONDITIONAL_ZERO_INIT
#define LIBSIMPLE_ARRAYALLOC_UNIQUE_IF_ZERO             LIBSIMPLE_MEMALLOC_UNIQUE_IF_ZERO
#define LIBSIMPLE_ARRAYALLOC_NULL_IF_ZERO               LIBSIMPLE_MEMALLOC_NULL_IF_ZERO
#define LIBSIMPLE_ARRAYALLOC_ALIGNMENT_TO_CACHE_LINE    LIBSIMPLE_MEMALLOC_ALIGNMENT_TO_CACHE_LINE
#define LIBSIMPLE_ARRAYALLOC_ALLOW_CACHE_LINE_SPLITTING LIBSIMPLE_MEMALLOC_ALLOW_CACHE_LINE_SPLITTING
#define LIBSIMPLE_ARRAYALLOC_ROUND_UP_SIZE_TO_ALIGNMENT LIBSIMPLE_MEMALLOC_ROUND_UP_SIZE_TO_ALIGNMENT
#define LIBSIMPLE_ARRAYALLOC_PRODUCT_SIZE               LIBSIMPLE_MEMALLOC_PRODUCT_SIZE
#define LIBSIMPLE_ARRAYALLOC_VA_PRODUCT_SIZE            LIBSIMPLE_MEMALLOC_VA_PRODUCT_SIZE
#define LIBSIMPLE_ARRAYALLOC_1_VA_PRODUCT_SIZE          LIBSIMPLE_MEMALLOC_1_VA_PRODUCT_SIZE
#define LIBSIMPLE_ARRAYALLOC_VA_LIST                    LIBSIMPLE_MEMALLOC_VA_LIST

#define libsimple_varrayalloc(TYPE, N, AP)\
	libsimple_memalloc(N, LIBSIMPLE_MEMALLOC_ELEMENT_SIZE, sizeof(TYPE),\
	                   LIBSIMPLE_MEMALLOC_ALIGNMENT, _Alignof(TYPE),\
	                   LIBSIMPLE_MEMALLOC_VA_LIST, AP, LIBSIMPLE_MEMALLOC_END)

#define libsimple_evarrayalloc(TYPE, N, AP)\
	libsimple_ememalloc(N, LIBSIMPLE_MEMALLOC_ELEMENT_SIZE, sizeof(TYPE),\
	                    LIBSIMPLE_MEMALLOC_ALIGNMENT, _Alignof(TYPE),\
	                    LIBSIMPLE_MEMALLOC_VA_LIST, AP, LIBSIMPLE_MEMALLOC_END)

#define libsimple_envarrayalloc(STATUS, TYPE, N, AP)\
	libsimple_enmemalloc(STATUS, N, LIBSIMPLE_MEMALLOC_ELEMENT_SIZE, sizeof(TYPE),\
	                     LIBSIMPLE_MEMALLOC_ALIGNMENT, _Alignof(TYPE),\
	                     LIBSIMPLE_MEMALLOC_VA_LIST, AP, LIBSIMPLE_MEMALLOC_END)

#define libsimple_arrayalloc(TYPE, N, ... /*, LIBSIMPLE_ARRAYALLOC_END */)\
	libsimple_memalloc(N, LIBSIMPLE_MEMALLOC_ELEMENT_SIZE, sizeof(TYPE),\
	                   LIBSIMPLE_MEMALLOC_ALIGNMENT, _Alignof(TYPE),\
	                   __VA_ARGS__)

#define libsimple_earrayalloc(TYPE, N, ... /*, LIBSIMPLE_ARRAYALLOC_END */)\
	libsimple_ememalloc(N, LIBSIMPLE_MEMALLOC_ELEMENT_SIZE, sizeof(TYPE),\
	                    LIBSIMPLE_MEMALLOC_ALIGNMENT, _Alignof(TYPE),\
	                    __VA_ARGS__)

#define libsimple_enarrayalloc(STATUS, TYPE, N, ... /*, LIBSIMPLE_ARRAYALLOC_END */)\
	libsimple_enmemalloc(STATUS, N, LIBSIMPLE_MEMALLOC_ELEMENT_SIZE, sizeof(TYPE),\
	                     LIBSIMPLE_MEMALLOC_ALIGNMENT, _Alignof(TYPE),\
	                     __VA_ARGS__)

LIBSIMPLE_GCC_ONLY__(__attribute__((__malloc__, __warn_unused_result__)))
void *libsimple_vmemalloc(size_t, va_list);

LIBSIMPLE_GCC_ONLY__(__attribute__((__malloc__, __warn_unused_result__)))
void *libsimple_envmemalloc(int, size_t, va_list);

LIBSIMPLE_GCC_ONLY__(__attribute__((__malloc__, __warn_unused_result__)))
inline void *
libsimple_evmemalloc(size_t n__, va_list ap__)
{
	return libsimple_envmemalloc(libsimple_default_failure_exit, n__, ap__);
}

LIBSIMPLE_GCC_ONLY__(__attribute__((__malloc__, __warn_unused_result__)))
inline void *
libsimple_memalloc(size_t n__, ... /*, LIBSIMPLE_MEMALLOC_END */)
{
	va_list ap__;
	va_start(ap__, n__);
	return libsimple_vmemalloc(n__, ap__);
	va_end(ap__);
}

LIBSIMPLE_GCC_ONLY__(__attribute__((__malloc__, __warn_unused_result__)))
inline void *
libsimple_enmemalloc(int status__, size_t n__, ... /*, LIBSIMPLE_MEMALLOC_END */)
{
	va_list ap__;
	va_start(ap__, n__);
	return libsimple_envmemalloc(status__, n__, ap__);
	va_end(ap__);
}

LIBSIMPLE_GCC_ONLY__(__attribute__((__malloc__, __warn_unused_result__)))
inline void *
libsimple_ememalloc(size_t n__, ... /*, LIBSIMPLE_MEMALLOC_END */)
{
	va_list ap__;
	va_start(ap__, n__);
	return libsimple_evmemalloc(n__, ap__);
	va_end(ap__);
}