1a4bd5210SJason Evans #ifndef JEMALLOC_H_
2a4bd5210SJason Evans #define JEMALLOC_H_
3a4bd5210SJason Evans #ifdef __cplusplus
4a4bd5210SJason Evans extern "C" {
5a4bd5210SJason Evans #endif
6a4bd5210SJason Evans 
7f921d10fSJason Evans /* Defined if __attribute__((...)) syntax is supported. */
8f921d10fSJason Evans #define JEMALLOC_HAVE_ATTR
9f921d10fSJason Evans 
10d0e79aa3SJason Evans /* Defined if alloc_size attribute is supported. */
11c5ad8142SEric van Gyzen #define JEMALLOC_HAVE_ATTR_ALLOC_SIZE
12c5ad8142SEric van Gyzen 
13c5ad8142SEric van Gyzen /* Defined if format_arg(...) attribute is supported. */
14c5ad8142SEric van Gyzen #define JEMALLOC_HAVE_ATTR_FORMAT_ARG
15d0e79aa3SJason Evans 
16d0e79aa3SJason Evans /* Defined if format(gnu_printf, ...) attribute is supported. */
17d0e79aa3SJason Evans /* #undef JEMALLOC_HAVE_ATTR_FORMAT_GNU_PRINTF */
18d0e79aa3SJason Evans 
19d0e79aa3SJason Evans /* Defined if format(printf, ...) attribute is supported. */
20d0e79aa3SJason Evans #define JEMALLOC_HAVE_ATTR_FORMAT_PRINTF
21f921d10fSJason Evans 
22f921d10fSJason Evans /*
23f921d10fSJason Evans  * Define overrides for non-standard allocator-related functions if they are
24f921d10fSJason Evans  * present on the system.
25f921d10fSJason Evans  */
26f921d10fSJason Evans /* #undef JEMALLOC_OVERRIDE_MEMALIGN */
27f921d10fSJason Evans #define JEMALLOC_OVERRIDE_VALLOC
28f921d10fSJason Evans 
29f921d10fSJason Evans /*
30f921d10fSJason Evans  * At least Linux omits the "const" in:
31f921d10fSJason Evans  *
32f921d10fSJason Evans  *   size_t malloc_usable_size(const void *ptr);
33f921d10fSJason Evans  *
34f921d10fSJason Evans  * Match the operating system's prototype.
35f921d10fSJason Evans  */
36f921d10fSJason Evans #define JEMALLOC_USABLE_SIZE_CONST const
37f921d10fSJason Evans 
38d0e79aa3SJason Evans /*
39d0e79aa3SJason Evans  * If defined, specify throw() for the public function prototypes when compiling
40d0e79aa3SJason Evans  * with C++.  The only justification for this is to match the prototypes that
41d0e79aa3SJason Evans  * glibc defines.
42d0e79aa3SJason Evans  */
43d0e79aa3SJason Evans /* #undef JEMALLOC_USE_CXX_THROW */
44d0e79aa3SJason Evans 
45df0d881dSJason Evans #ifdef _MSC_VER
46df0d881dSJason Evans #  ifdef _WIN64
47df0d881dSJason Evans #    define LG_SIZEOF_PTR_WIN 3
48df0d881dSJason Evans #  else
49df0d881dSJason Evans #    define LG_SIZEOF_PTR_WIN 2
50df0d881dSJason Evans #  endif
51df0d881dSJason Evans #endif
52df0d881dSJason Evans 
53f921d10fSJason Evans /* sizeof(void *) == 2^LG_SIZEOF_PTR. */
54f921d10fSJason Evans #define LG_SIZEOF_PTR 3
55f921d10fSJason Evans 
56f921d10fSJason Evans /*
57f921d10fSJason Evans  * Name mangling for public symbols is controlled by --with-mangling and
58f921d10fSJason Evans  * --with-jemalloc-prefix.  With default settings the je_ prefix is stripped by
59f921d10fSJason Evans  * these macro definitions.
60f921d10fSJason Evans  */
61f921d10fSJason Evans #ifndef JEMALLOC_NO_RENAME
62b7eaed25SJason Evans #  define je_aligned_alloc aligned_alloc
63b7eaed25SJason Evans #  define je_calloc calloc
64b7eaed25SJason Evans #  define je_dallocx dallocx
65b7eaed25SJason Evans #  define je_free free
66b7eaed25SJason Evans #  define je_mallctl mallctl
67b7eaed25SJason Evans #  define je_mallctlbymib mallctlbymib
68b7eaed25SJason Evans #  define je_mallctlnametomib mallctlnametomib
69b7eaed25SJason Evans #  define je_malloc malloc
70f921d10fSJason Evans #  define je_malloc_conf malloc_conf
71f921d10fSJason Evans #  define je_malloc_message malloc_message
72f921d10fSJason Evans #  define je_malloc_stats_print malloc_stats_print
73f921d10fSJason Evans #  define je_malloc_usable_size malloc_usable_size
74b7eaed25SJason Evans #  define je_mallocx mallocx
75c5ad8142SEric van Gyzen #  define je_smallocx_ea6b3e973b477b8061e0076bb257dbd7f3faa756 smallocx_ea6b3e973b477b8061e0076bb257dbd7f3faa756
76b7eaed25SJason Evans #  define je_nallocx nallocx
77b7eaed25SJason Evans #  define je_posix_memalign posix_memalign
78b7eaed25SJason Evans #  define je_rallocx rallocx
79b7eaed25SJason Evans #  define je_realloc realloc
80b7eaed25SJason Evans #  define je_sallocx sallocx
81b7eaed25SJason Evans #  define je_sdallocx sdallocx
82b7eaed25SJason Evans #  define je_xallocx xallocx
83f921d10fSJason Evans #  define je_valloc valloc
84f921d10fSJason Evans #endif
85f921d10fSJason Evans 
86f921d10fSJason Evans #include "jemalloc_FreeBSD.h"
87f921d10fSJason Evans 
88d0e79aa3SJason Evans #include <stdlib.h>
89d0e79aa3SJason Evans #include <stdbool.h>
90d0e79aa3SJason Evans #include <stdint.h>
91a4bd5210SJason Evans #include <limits.h>
92a4bd5210SJason Evans #include <strings.h>
93a4bd5210SJason Evans 
94c5ad8142SEric van Gyzen #define JEMALLOC_VERSION "5.2.1-0-gea6b3e973b477b8061e0076bb257dbd7f3faa756"
95b7eaed25SJason Evans #define JEMALLOC_VERSION_MAJOR 5
96c5ad8142SEric van Gyzen #define JEMALLOC_VERSION_MINOR 2
97c5ad8142SEric van Gyzen #define JEMALLOC_VERSION_BUGFIX 1
988b2f5aafSJason Evans #define JEMALLOC_VERSION_NREV 0
99c5ad8142SEric van Gyzen #define JEMALLOC_VERSION_GID "ea6b3e973b477b8061e0076bb257dbd7f3faa756"
100c5ad8142SEric van Gyzen #define JEMALLOC_VERSION_GID_IDENT ea6b3e973b477b8061e0076bb257dbd7f3faa756
101a4bd5210SJason Evans 
102df0d881dSJason Evans #define MALLOCX_LG_ALIGN(la)	((int)(la))
103f921d10fSJason Evans #if LG_SIZEOF_PTR == 2
1041f0a49e8SJason Evans #  define MALLOCX_ALIGN(a)	((int)(ffs((int)(a))-1))
105f921d10fSJason Evans #else
106f921d10fSJason Evans #  define MALLOCX_ALIGN(a)						\
1071f0a49e8SJason Evans      ((int)(((size_t)(a) < (size_t)INT_MAX) ? ffs((int)(a))-1 :	\
1081f0a49e8SJason Evans      ffs((int)(((size_t)(a))>>32))+31))
109f921d10fSJason Evans #endif
110f921d10fSJason Evans #define MALLOCX_ZERO	((int)0x40)
111d0e79aa3SJason Evans /*
112d0e79aa3SJason Evans  * Bias tcache index bits so that 0 encodes "automatic tcache management", and 1
113d0e79aa3SJason Evans  * encodes MALLOCX_TCACHE_NONE.
114d0e79aa3SJason Evans  */
115d0e79aa3SJason Evans #define MALLOCX_TCACHE(tc)	((int)(((tc)+2) << 8))
116d0e79aa3SJason Evans #define MALLOCX_TCACHE_NONE	MALLOCX_TCACHE(-1)
117d0e79aa3SJason Evans /*
118d0e79aa3SJason Evans  * Bias arena index bits so that 0 encodes "use an automatically chosen arena".
119d0e79aa3SJason Evans  */
1201f0a49e8SJason Evans #define MALLOCX_ARENA(a)	((((int)(a))+1) << 20)
121a4bd5210SJason Evans 
122b7eaed25SJason Evans /*
123b7eaed25SJason Evans  * Use as arena index in "arena.<i>.{purge,decay,dss}" and
124b7eaed25SJason Evans  * "stats.arenas.<i>.*" mallctl interfaces to select all arenas.  This
125b7eaed25SJason Evans  * definition is intentionally specified in raw decimal format to support
126b7eaed25SJason Evans  * cpp-based string concatenation, e.g.
127b7eaed25SJason Evans  *
128b7eaed25SJason Evans  *   #define STRINGIFY_HELPER(x) #x
129b7eaed25SJason Evans  *   #define STRINGIFY(x) STRINGIFY_HELPER(x)
130b7eaed25SJason Evans  *
131b7eaed25SJason Evans  *   mallctl("arena." STRINGIFY(MALLCTL_ARENAS_ALL) ".purge", NULL, NULL, NULL,
132b7eaed25SJason Evans  *       0);
133b7eaed25SJason Evans  */
134b7eaed25SJason Evans #define MALLCTL_ARENAS_ALL	4096
135b7eaed25SJason Evans /*
136b7eaed25SJason Evans  * Use as arena index in "stats.arenas.<i>.*" mallctl interfaces to select
137b7eaed25SJason Evans  * destroyed arenas.
138b7eaed25SJason Evans  */
139b7eaed25SJason Evans #define MALLCTL_ARENAS_DESTROYED	4097
140b7eaed25SJason Evans 
141d0e79aa3SJason Evans #if defined(__cplusplus) && defined(JEMALLOC_USE_CXX_THROW)
142d0e79aa3SJason Evans #  define JEMALLOC_CXX_THROW throw()
143a4bd5210SJason Evans #else
144d0e79aa3SJason Evans #  define JEMALLOC_CXX_THROW
145a4bd5210SJason Evans #endif
146a4bd5210SJason Evans 
147b7eaed25SJason Evans #if defined(_MSC_VER)
148f921d10fSJason Evans #  define JEMALLOC_ATTR(s)
149d0e79aa3SJason Evans #  define JEMALLOC_ALIGNED(s) __declspec(align(s))
150d0e79aa3SJason Evans #  define JEMALLOC_ALLOC_SIZE(s)
151d0e79aa3SJason Evans #  define JEMALLOC_ALLOC_SIZE2(s1, s2)
152d0e79aa3SJason Evans #  ifndef JEMALLOC_EXPORT
153f921d10fSJason Evans #    ifdef DLLEXPORT
154f921d10fSJason Evans #      define JEMALLOC_EXPORT __declspec(dllexport)
155f921d10fSJason Evans #    else
156f921d10fSJason Evans #      define JEMALLOC_EXPORT __declspec(dllimport)
157f921d10fSJason Evans #    endif
158d0e79aa3SJason Evans #  endif
159c5ad8142SEric van Gyzen #  define JEMALLOC_FORMAT_ARG(i)
160d0e79aa3SJason Evans #  define JEMALLOC_FORMAT_PRINTF(s, i)
161f921d10fSJason Evans #  define JEMALLOC_NOINLINE __declspec(noinline)
162d0e79aa3SJason Evans #  ifdef __cplusplus
163d0e79aa3SJason Evans #    define JEMALLOC_NOTHROW __declspec(nothrow)
164d0e79aa3SJason Evans #  else
165d0e79aa3SJason Evans #    define JEMALLOC_NOTHROW
166d0e79aa3SJason Evans #  endif
167d0e79aa3SJason Evans #  define JEMALLOC_SECTION(s) __declspec(allocate(s))
168d0e79aa3SJason Evans #  define JEMALLOC_RESTRICT_RETURN __declspec(restrict)
169d0e79aa3SJason Evans #  if _MSC_VER >= 1900 && !defined(__EDG__)
170d0e79aa3SJason Evans #    define JEMALLOC_ALLOCATOR __declspec(allocator)
171d0e79aa3SJason Evans #  else
172d0e79aa3SJason Evans #    define JEMALLOC_ALLOCATOR
173d0e79aa3SJason Evans #  endif
174df0d881dSJason Evans #elif defined(JEMALLOC_HAVE_ATTR)
175df0d881dSJason Evans #  define JEMALLOC_ATTR(s) __attribute__((s))
176df0d881dSJason Evans #  define JEMALLOC_ALIGNED(s) JEMALLOC_ATTR(aligned(s))
177df0d881dSJason Evans #  ifdef JEMALLOC_HAVE_ATTR_ALLOC_SIZE
178df0d881dSJason Evans #    define JEMALLOC_ALLOC_SIZE(s) JEMALLOC_ATTR(alloc_size(s))
179df0d881dSJason Evans #    define JEMALLOC_ALLOC_SIZE2(s1, s2) JEMALLOC_ATTR(alloc_size(s1, s2))
180df0d881dSJason Evans #  else
181df0d881dSJason Evans #    define JEMALLOC_ALLOC_SIZE(s)
182df0d881dSJason Evans #    define JEMALLOC_ALLOC_SIZE2(s1, s2)
183df0d881dSJason Evans #  endif
184df0d881dSJason Evans #  ifndef JEMALLOC_EXPORT
185df0d881dSJason Evans #    define JEMALLOC_EXPORT JEMALLOC_ATTR(visibility("default"))
186df0d881dSJason Evans #  endif
187c5ad8142SEric van Gyzen #  ifdef JEMALLOC_HAVE_ATTR_FORMAT_ARG
188c5ad8142SEric van Gyzen #    define JEMALLOC_FORMAT_ARG(i) JEMALLOC_ATTR(__format_arg__(3))
189c5ad8142SEric van Gyzen #  else
190c5ad8142SEric van Gyzen #    define JEMALLOC_FORMAT_ARG(i)
191c5ad8142SEric van Gyzen #  endif
192df0d881dSJason Evans #  ifdef JEMALLOC_HAVE_ATTR_FORMAT_GNU_PRINTF
193df0d881dSJason Evans #    define JEMALLOC_FORMAT_PRINTF(s, i) JEMALLOC_ATTR(format(gnu_printf, s, i))
194df0d881dSJason Evans #  elif defined(JEMALLOC_HAVE_ATTR_FORMAT_PRINTF)
195df0d881dSJason Evans #    define JEMALLOC_FORMAT_PRINTF(s, i) JEMALLOC_ATTR(format(printf, s, i))
196df0d881dSJason Evans #  else
197df0d881dSJason Evans #    define JEMALLOC_FORMAT_PRINTF(s, i)
198df0d881dSJason Evans #  endif
199df0d881dSJason Evans #  define JEMALLOC_NOINLINE JEMALLOC_ATTR(noinline)
200df0d881dSJason Evans #  define JEMALLOC_NOTHROW JEMALLOC_ATTR(nothrow)
201df0d881dSJason Evans #  define JEMALLOC_SECTION(s) JEMALLOC_ATTR(section(s))
202df0d881dSJason Evans #  define JEMALLOC_RESTRICT_RETURN
203df0d881dSJason Evans #  define JEMALLOC_ALLOCATOR
204f921d10fSJason Evans #else
205f921d10fSJason Evans #  define JEMALLOC_ATTR(s)
206f921d10fSJason Evans #  define JEMALLOC_ALIGNED(s)
207d0e79aa3SJason Evans #  define JEMALLOC_ALLOC_SIZE(s)
208d0e79aa3SJason Evans #  define JEMALLOC_ALLOC_SIZE2(s1, s2)
209d0e79aa3SJason Evans #  define JEMALLOC_EXPORT
210d0e79aa3SJason Evans #  define JEMALLOC_FORMAT_PRINTF(s, i)
211f921d10fSJason Evans #  define JEMALLOC_NOINLINE
212d0e79aa3SJason Evans #  define JEMALLOC_NOTHROW
213d0e79aa3SJason Evans #  define JEMALLOC_SECTION(s)
214d0e79aa3SJason Evans #  define JEMALLOC_RESTRICT_RETURN
215d0e79aa3SJason Evans #  define JEMALLOC_ALLOCATOR
216f921d10fSJason Evans #endif
217f921d10fSJason Evans 
218a4bd5210SJason Evans /*
219f921d10fSJason Evans  * The je_ prefix on the following public symbol declarations is an artifact
220f921d10fSJason Evans  * of namespace management, and should be omitted in application code unless
221f921d10fSJason Evans  * JEMALLOC_NO_DEMANGLE is defined (see jemalloc_mangle.h).
222a4bd5210SJason Evans  */
223e722f8f8SJason Evans extern JEMALLOC_EXPORT const char	*je_malloc_conf;
224e722f8f8SJason Evans extern JEMALLOC_EXPORT void		(*je_malloc_message)(void *cbopaque,
225e722f8f8SJason Evans     const char *s);
226a4bd5210SJason Evans 
227d0e79aa3SJason Evans JEMALLOC_EXPORT JEMALLOC_ALLOCATOR JEMALLOC_RESTRICT_RETURN
228d0e79aa3SJason Evans     void JEMALLOC_NOTHROW	*je_malloc(size_t size)
229d0e79aa3SJason Evans     JEMALLOC_CXX_THROW JEMALLOC_ATTR(malloc) JEMALLOC_ALLOC_SIZE(1);
230d0e79aa3SJason Evans JEMALLOC_EXPORT JEMALLOC_ALLOCATOR JEMALLOC_RESTRICT_RETURN
231d0e79aa3SJason Evans     void JEMALLOC_NOTHROW	*je_calloc(size_t num, size_t size)
232d0e79aa3SJason Evans     JEMALLOC_CXX_THROW JEMALLOC_ATTR(malloc) JEMALLOC_ALLOC_SIZE2(1, 2);
233d0e79aa3SJason Evans JEMALLOC_EXPORT int JEMALLOC_NOTHROW	je_posix_memalign(void **memptr,
234d0e79aa3SJason Evans     size_t alignment, size_t size) JEMALLOC_CXX_THROW JEMALLOC_ATTR(nonnull(1));
235d0e79aa3SJason Evans JEMALLOC_EXPORT JEMALLOC_ALLOCATOR JEMALLOC_RESTRICT_RETURN
236d0e79aa3SJason Evans     void JEMALLOC_NOTHROW	*je_aligned_alloc(size_t alignment,
237d0e79aa3SJason Evans     size_t size) JEMALLOC_CXX_THROW JEMALLOC_ATTR(malloc)
238d0e79aa3SJason Evans     JEMALLOC_ALLOC_SIZE(2);
239d0e79aa3SJason Evans JEMALLOC_EXPORT JEMALLOC_ALLOCATOR JEMALLOC_RESTRICT_RETURN
240d0e79aa3SJason Evans     void JEMALLOC_NOTHROW	*je_realloc(void *ptr, size_t size)
241d0e79aa3SJason Evans     JEMALLOC_CXX_THROW JEMALLOC_ALLOC_SIZE(2);
242d0e79aa3SJason Evans JEMALLOC_EXPORT void JEMALLOC_NOTHROW	je_free(void *ptr)
243d0e79aa3SJason Evans     JEMALLOC_CXX_THROW;
244a4bd5210SJason Evans 
245d0e79aa3SJason Evans JEMALLOC_EXPORT JEMALLOC_ALLOCATOR JEMALLOC_RESTRICT_RETURN
246d0e79aa3SJason Evans     void JEMALLOC_NOTHROW	*je_mallocx(size_t size, int flags)
247d0e79aa3SJason Evans     JEMALLOC_ATTR(malloc) JEMALLOC_ALLOC_SIZE(1);
248d0e79aa3SJason Evans JEMALLOC_EXPORT JEMALLOC_ALLOCATOR JEMALLOC_RESTRICT_RETURN
249d0e79aa3SJason Evans     void JEMALLOC_NOTHROW	*je_rallocx(void *ptr, size_t size,
250d0e79aa3SJason Evans     int flags) JEMALLOC_ALLOC_SIZE(2);
251d0e79aa3SJason Evans JEMALLOC_EXPORT size_t JEMALLOC_NOTHROW	je_xallocx(void *ptr, size_t size,
252d0e79aa3SJason Evans     size_t extra, int flags);
253d0e79aa3SJason Evans JEMALLOC_EXPORT size_t JEMALLOC_NOTHROW	je_sallocx(const void *ptr,
254d0e79aa3SJason Evans     int flags) JEMALLOC_ATTR(pure);
255d0e79aa3SJason Evans JEMALLOC_EXPORT void JEMALLOC_NOTHROW	je_dallocx(void *ptr, int flags);
256d0e79aa3SJason Evans JEMALLOC_EXPORT void JEMALLOC_NOTHROW	je_sdallocx(void *ptr, size_t size,
257f921d10fSJason Evans     int flags);
258d0e79aa3SJason Evans JEMALLOC_EXPORT size_t JEMALLOC_NOTHROW	je_nallocx(size_t size, int flags)
259d0e79aa3SJason Evans     JEMALLOC_ATTR(pure);
260f921d10fSJason Evans 
261d0e79aa3SJason Evans JEMALLOC_EXPORT int JEMALLOC_NOTHROW	je_mallctl(const char *name,
262f921d10fSJason Evans     void *oldp, size_t *oldlenp, void *newp, size_t newlen);
263d0e79aa3SJason Evans JEMALLOC_EXPORT int JEMALLOC_NOTHROW	je_mallctlnametomib(const char *name,
264d0e79aa3SJason Evans     size_t *mibp, size_t *miblenp);
265d0e79aa3SJason Evans JEMALLOC_EXPORT int JEMALLOC_NOTHROW	je_mallctlbymib(const size_t *mib,
266d0e79aa3SJason Evans     size_t miblen, void *oldp, size_t *oldlenp, void *newp, size_t newlen);
267d0e79aa3SJason Evans JEMALLOC_EXPORT void JEMALLOC_NOTHROW	je_malloc_stats_print(
268d0e79aa3SJason Evans     void (*write_cb)(void *, const char *), void *je_cbopaque,
269d0e79aa3SJason Evans     const char *opts);
270d0e79aa3SJason Evans JEMALLOC_EXPORT size_t JEMALLOC_NOTHROW	je_malloc_usable_size(
271d0e79aa3SJason Evans     JEMALLOC_USABLE_SIZE_CONST void *ptr) JEMALLOC_CXX_THROW;
272f921d10fSJason Evans 
273e722f8f8SJason Evans #ifdef JEMALLOC_OVERRIDE_MEMALIGN
274d0e79aa3SJason Evans JEMALLOC_EXPORT JEMALLOC_ALLOCATOR JEMALLOC_RESTRICT_RETURN
275d0e79aa3SJason Evans     void JEMALLOC_NOTHROW	*je_memalign(size_t alignment, size_t size)
276536b3538SJason Evans     JEMALLOC_CXX_THROW JEMALLOC_ATTR(malloc);
277e722f8f8SJason Evans #endif
278e722f8f8SJason Evans 
279e722f8f8SJason Evans #ifdef JEMALLOC_OVERRIDE_VALLOC
280d0e79aa3SJason Evans JEMALLOC_EXPORT JEMALLOC_ALLOCATOR JEMALLOC_RESTRICT_RETURN
281d0e79aa3SJason Evans     void JEMALLOC_NOTHROW	*je_valloc(size_t size) JEMALLOC_CXX_THROW
282d0e79aa3SJason Evans     JEMALLOC_ATTR(malloc);
283e722f8f8SJason Evans #endif
284e722f8f8SJason Evans 
285b7eaed25SJason Evans typedef struct extent_hooks_s extent_hooks_t;
286b7eaed25SJason Evans 
287d0e79aa3SJason Evans /*
288d0e79aa3SJason Evans  * void *
289b7eaed25SJason Evans  * extent_alloc(extent_hooks_t *extent_hooks, void *new_addr, size_t size,
290b7eaed25SJason Evans  *     size_t alignment, bool *zero, bool *commit, unsigned arena_ind);
291d0e79aa3SJason Evans  */
292b7eaed25SJason Evans typedef void *(extent_alloc_t)(extent_hooks_t *, void *, size_t, size_t, bool *,
293b7eaed25SJason Evans     bool *, unsigned);
294d0e79aa3SJason Evans 
295d0e79aa3SJason Evans /*
296d0e79aa3SJason Evans  * bool
297b7eaed25SJason Evans  * extent_dalloc(extent_hooks_t *extent_hooks, void *addr, size_t size,
298d0e79aa3SJason Evans  *     bool committed, unsigned arena_ind);
299d0e79aa3SJason Evans  */
300b7eaed25SJason Evans typedef bool (extent_dalloc_t)(extent_hooks_t *, void *, size_t, bool,
301b7eaed25SJason Evans     unsigned);
302b7eaed25SJason Evans 
303b7eaed25SJason Evans /*
304b7eaed25SJason Evans  * void
305b7eaed25SJason Evans  * extent_destroy(extent_hooks_t *extent_hooks, void *addr, size_t size,
306b7eaed25SJason Evans  *     bool committed, unsigned arena_ind);
307b7eaed25SJason Evans  */
308b7eaed25SJason Evans typedef void (extent_destroy_t)(extent_hooks_t *, void *, size_t, bool,
309b7eaed25SJason Evans     unsigned);
310d0e79aa3SJason Evans 
311d0e79aa3SJason Evans /*
312d0e79aa3SJason Evans  * bool
313b7eaed25SJason Evans  * extent_commit(extent_hooks_t *extent_hooks, void *addr, size_t size,
314b7eaed25SJason Evans  *     size_t offset, size_t length, unsigned arena_ind);
315d0e79aa3SJason Evans  */
316b7eaed25SJason Evans typedef bool (extent_commit_t)(extent_hooks_t *, void *, size_t, size_t, size_t,
317b7eaed25SJason Evans     unsigned);
318d0e79aa3SJason Evans 
319b7eaed25SJason Evans /*
320b7eaed25SJason Evans  * bool
321b7eaed25SJason Evans  * extent_decommit(extent_hooks_t *extent_hooks, void *addr, size_t size,
322b7eaed25SJason Evans  *     size_t offset, size_t length, unsigned arena_ind);
323b7eaed25SJason Evans  */
324b7eaed25SJason Evans typedef bool (extent_decommit_t)(extent_hooks_t *, void *, size_t, size_t,
325b7eaed25SJason Evans     size_t, unsigned);
326b7eaed25SJason Evans 
327b7eaed25SJason Evans /*
328b7eaed25SJason Evans  * bool
329b7eaed25SJason Evans  * extent_purge(extent_hooks_t *extent_hooks, void *addr, size_t size,
330b7eaed25SJason Evans  *     size_t offset, size_t length, unsigned arena_ind);
331b7eaed25SJason Evans  */
332b7eaed25SJason Evans typedef bool (extent_purge_t)(extent_hooks_t *, void *, size_t, size_t, size_t,
333b7eaed25SJason Evans     unsigned);
334b7eaed25SJason Evans 
335b7eaed25SJason Evans /*
336b7eaed25SJason Evans  * bool
337b7eaed25SJason Evans  * extent_split(extent_hooks_t *extent_hooks, void *addr, size_t size,
338b7eaed25SJason Evans  *     size_t size_a, size_t size_b, bool committed, unsigned arena_ind);
339b7eaed25SJason Evans  */
340b7eaed25SJason Evans typedef bool (extent_split_t)(extent_hooks_t *, void *, size_t, size_t, size_t,
341b7eaed25SJason Evans     bool, unsigned);
342b7eaed25SJason Evans 
343b7eaed25SJason Evans /*
344b7eaed25SJason Evans  * bool
345b7eaed25SJason Evans  * extent_merge(extent_hooks_t *extent_hooks, void *addr_a, size_t size_a,
346b7eaed25SJason Evans  *     void *addr_b, size_t size_b, bool committed, unsigned arena_ind);
347b7eaed25SJason Evans  */
348b7eaed25SJason Evans typedef bool (extent_merge_t)(extent_hooks_t *, void *, size_t, void *, size_t,
349b7eaed25SJason Evans     bool, unsigned);
350b7eaed25SJason Evans 
351b7eaed25SJason Evans struct extent_hooks_s {
352b7eaed25SJason Evans 	extent_alloc_t		*alloc;
353b7eaed25SJason Evans 	extent_dalloc_t		*dalloc;
354b7eaed25SJason Evans 	extent_destroy_t	*destroy;
355b7eaed25SJason Evans 	extent_commit_t		*commit;
356b7eaed25SJason Evans 	extent_decommit_t	*decommit;
357b7eaed25SJason Evans 	extent_purge_t		*purge_lazy;
358b7eaed25SJason Evans 	extent_purge_t		*purge_forced;
359b7eaed25SJason Evans 	extent_split_t		*split;
360b7eaed25SJason Evans 	extent_merge_t		*merge;
361b7eaed25SJason Evans };
362a4bd5210SJason Evans 
363a4bd5210SJason Evans /*
364a4bd5210SJason Evans  * By default application code must explicitly refer to mangled symbol names,
365a4bd5210SJason Evans  * so that it is possible to use jemalloc in conjunction with another allocator
366a4bd5210SJason Evans  * in the same application.  Define JEMALLOC_MANGLE in order to cause automatic
367a4bd5210SJason Evans  * name mangling that matches the API prefixing that happened as a result of
368a4bd5210SJason Evans  * --with-mangling and/or --with-jemalloc-prefix configuration settings.
369a4bd5210SJason Evans  */
370a4bd5210SJason Evans #ifdef JEMALLOC_MANGLE
371a4bd5210SJason Evans #  ifndef JEMALLOC_NO_DEMANGLE
372a4bd5210SJason Evans #    define JEMALLOC_NO_DEMANGLE
373a4bd5210SJason Evans #  endif
374b7eaed25SJason Evans #  define aligned_alloc je_aligned_alloc
375b7eaed25SJason Evans #  define calloc je_calloc
376b7eaed25SJason Evans #  define dallocx je_dallocx
377b7eaed25SJason Evans #  define free je_free
378b7eaed25SJason Evans #  define mallctl je_mallctl
379b7eaed25SJason Evans #  define mallctlbymib je_mallctlbymib
380b7eaed25SJason Evans #  define mallctlnametomib je_mallctlnametomib
381b7eaed25SJason Evans #  define malloc je_malloc
382a4bd5210SJason Evans #  define malloc_conf je_malloc_conf
383a4bd5210SJason Evans #  define malloc_message je_malloc_message
384f921d10fSJason Evans #  define malloc_stats_print je_malloc_stats_print
385f921d10fSJason Evans #  define malloc_usable_size je_malloc_usable_size
386b7eaed25SJason Evans #  define mallocx je_mallocx
387c5ad8142SEric van Gyzen #  define smallocx_ea6b3e973b477b8061e0076bb257dbd7f3faa756 je_smallocx_ea6b3e973b477b8061e0076bb257dbd7f3faa756
388b7eaed25SJason Evans #  define nallocx je_nallocx
389b7eaed25SJason Evans #  define posix_memalign je_posix_memalign
390b7eaed25SJason Evans #  define rallocx je_rallocx
391b7eaed25SJason Evans #  define realloc je_realloc
392b7eaed25SJason Evans #  define sallocx je_sallocx
393b7eaed25SJason Evans #  define sdallocx je_sdallocx
394b7eaed25SJason Evans #  define xallocx je_xallocx
395a4bd5210SJason Evans #  define valloc je_valloc
396a4bd5210SJason Evans #endif
397a4bd5210SJason Evans 
398a4bd5210SJason Evans /*
399f921d10fSJason Evans  * The je_* macros can be used as stable alternative names for the
400f921d10fSJason Evans  * public jemalloc API if JEMALLOC_NO_DEMANGLE is defined.  This is primarily
401f921d10fSJason Evans  * meant for use in jemalloc itself, but it can be used by application code to
402a4bd5210SJason Evans  * provide isolation from the name mangling specified via --with-mangling
403a4bd5210SJason Evans  * and/or --with-jemalloc-prefix.
404a4bd5210SJason Evans  */
405a4bd5210SJason Evans #ifndef JEMALLOC_NO_DEMANGLE
406b7eaed25SJason Evans #  undef je_aligned_alloc
407b7eaed25SJason Evans #  undef je_calloc
408b7eaed25SJason Evans #  undef je_dallocx
409b7eaed25SJason Evans #  undef je_free
410b7eaed25SJason Evans #  undef je_mallctl
411b7eaed25SJason Evans #  undef je_mallctlbymib
412b7eaed25SJason Evans #  undef je_mallctlnametomib
413b7eaed25SJason Evans #  undef je_malloc
414a4bd5210SJason Evans #  undef je_malloc_conf
415a4bd5210SJason Evans #  undef je_malloc_message
416f921d10fSJason Evans #  undef je_malloc_stats_print
417f921d10fSJason Evans #  undef je_malloc_usable_size
418b7eaed25SJason Evans #  undef je_mallocx
419c5ad8142SEric van Gyzen #  undef je_smallocx_ea6b3e973b477b8061e0076bb257dbd7f3faa756
420b7eaed25SJason Evans #  undef je_nallocx
421b7eaed25SJason Evans #  undef je_posix_memalign
422b7eaed25SJason Evans #  undef je_rallocx
423b7eaed25SJason Evans #  undef je_realloc
424b7eaed25SJason Evans #  undef je_sallocx
425b7eaed25SJason Evans #  undef je_sdallocx
426b7eaed25SJason Evans #  undef je_xallocx
427a4bd5210SJason Evans #  undef je_valloc
428a4bd5210SJason Evans #endif
429a4bd5210SJason Evans 
430a4bd5210SJason Evans #ifdef __cplusplus
431d0e79aa3SJason Evans }
432a4bd5210SJason Evans #endif
433a4bd5210SJason Evans #endif /* JEMALLOC_H_ */
434