xref: /freebsd/contrib/jemalloc/FREEBSD-diffs (revision d0e79aa362ed3a077477d26af7a40f64f4516e90)
1a4bd5210SJason Evansdiff --git a/doc/jemalloc.xml.in b/doc/jemalloc.xml.in
2*d0e79aa3SJason Evansindex 8fc774b..47b453c 100644
3a4bd5210SJason Evans--- a/doc/jemalloc.xml.in
4a4bd5210SJason Evans+++ b/doc/jemalloc.xml.in
5*d0e79aa3SJason Evans@@ -53,6 +53,17 @@
6a4bd5210SJason Evans     <para>This manual describes jemalloc @jemalloc_version@.  More information
7a4bd5210SJason Evans     can be found at the <ulink
8a4bd5210SJason Evans     url="http://www.canonware.com/jemalloc/">jemalloc website</ulink>.</para>
9a4bd5210SJason Evans+
10a4bd5210SJason Evans+    <para>The following configuration options are enabled in libc's built-in
11*d0e79aa3SJason Evans+    jemalloc: <option>--enable-fill</option>,
12a4bd5210SJason Evans+    <option>--enable-lazy-lock</option>, <option>--enable-munmap</option>,
13a4bd5210SJason Evans+    <option>--enable-stats</option>, <option>--enable-tcache</option>,
14a4bd5210SJason Evans+    <option>--enable-tls</option>, <option>--enable-utrace</option>, and
15a4bd5210SJason Evans+    <option>--enable-xmalloc</option>.  Additionally,
16a4bd5210SJason Evans+    <option>--enable-debug</option> is enabled in development versions of
17a4bd5210SJason Evans+    FreeBSD (controlled by the <constant>MALLOC_PRODUCTION</constant> make
18a4bd5210SJason Evans+    variable).</para>
19*d0e79aa3SJason Evans+
20a4bd5210SJason Evans   </refsect1>
21a4bd5210SJason Evans   <refsynopsisdiv>
22a4bd5210SJason Evans     <title>SYNOPSIS</title>
23*d0e79aa3SJason Evans@@ -2759,4 +2770,18 @@ malloc_conf = "lg_chunk:24";]]></programlisting></para>
24a4bd5210SJason Evans     <para>The <function>posix_memalign<parameter/></function> function conforms
25a4bd5210SJason Evans     to IEEE Std 1003.1-2001 (&ldquo;POSIX.1&rdquo;).</para>
26a4bd5210SJason Evans   </refsect1>
27a4bd5210SJason Evans+  <refsect1 id="history">
28a4bd5210SJason Evans+    <title>HISTORY</title>
29a4bd5210SJason Evans+    <para>The <function>malloc_usable_size<parameter/></function> and
30a4bd5210SJason Evans+    <function>posix_memalign<parameter/></function> functions first appeared in
31a4bd5210SJason Evans+    FreeBSD 7.0.</para>
32a4bd5210SJason Evans+
33a4bd5210SJason Evans+    <para>The <function>aligned_alloc<parameter/></function>,
34*d0e79aa3SJason Evans+    <function>malloc_stats_print<parameter/></function>, and
35*d0e79aa3SJason Evans+    <function>mallctl*<parameter/></function> functions first appeared in
36a4bd5210SJason Evans+    FreeBSD 10.0.</para>
37f921d10fSJason Evans+
38f921d10fSJason Evans+    <para>The <function>*allocx<parameter/></function> functions first appeared
39f921d10fSJason Evans+    in FreeBSD 11.0.</para>
40a4bd5210SJason Evans+  </refsect1>
41a4bd5210SJason Evans </refentry>
42a4bd5210SJason Evansdiff --git a/include/jemalloc/internal/jemalloc_internal.h.in b/include/jemalloc/internal/jemalloc_internal.h.in
43*d0e79aa3SJason Evansindex 7a137b6..b0001e9 100644
44a4bd5210SJason Evans--- a/include/jemalloc/internal/jemalloc_internal.h.in
45a4bd5210SJason Evans+++ b/include/jemalloc/internal/jemalloc_internal.h.in
46*d0e79aa3SJason Evans@@ -8,6 +8,9 @@
47*d0e79aa3SJason Evans #include <sys/ktrace.h>
48e722f8f8SJason Evans #endif
49a4bd5210SJason Evans
50a4bd5210SJason Evans+#include "un-namespace.h"
51a4bd5210SJason Evans+#include "libc_private.h"
52a4bd5210SJason Evans+
53a4bd5210SJason Evans #define	JEMALLOC_NO_DEMANGLE
54f921d10fSJason Evans #ifdef JEMALLOC_JET
55f921d10fSJason Evans #  define JEMALLOC_N(n) jet_##n
56*d0e79aa3SJason Evans@@ -42,13 +45,7 @@ static const bool config_fill =
57edaa25bdSJason Evans     false
58edaa25bdSJason Evans #endif
59edaa25bdSJason Evans     ;
60edaa25bdSJason Evans-static const bool config_lazy_lock =
61edaa25bdSJason Evans-#ifdef JEMALLOC_LAZY_LOCK
62edaa25bdSJason Evans-    true
63edaa25bdSJason Evans-#else
64edaa25bdSJason Evans-    false
65edaa25bdSJason Evans-#endif
66edaa25bdSJason Evans-    ;
67edaa25bdSJason Evans+static const bool config_lazy_lock = true;
68edaa25bdSJason Evans static const bool config_prof =
69edaa25bdSJason Evans #ifdef JEMALLOC_PROF
70edaa25bdSJason Evans     true
71*d0e79aa3SJason Evansdiff --git a/include/jemalloc/internal/jemalloc_internal_decls.h b/include/jemalloc/internal/jemalloc_internal_decls.h
72*d0e79aa3SJason Evansindex a601d6e..e7094b2 100644
73*d0e79aa3SJason Evans--- a/include/jemalloc/internal/jemalloc_internal_decls.h
74*d0e79aa3SJason Evans+++ b/include/jemalloc/internal/jemalloc_internal_decls.h
75*d0e79aa3SJason Evans@@ -1,6 +1,9 @@
76*d0e79aa3SJason Evans #ifndef JEMALLOC_INTERNAL_DECLS_H
77*d0e79aa3SJason Evans #define	JEMALLOC_INTERNAL_DECLS_H
78*d0e79aa3SJason Evans
79*d0e79aa3SJason Evans+#include "libc_private.h"
80*d0e79aa3SJason Evans+#include "namespace.h"
81*d0e79aa3SJason Evans+
82*d0e79aa3SJason Evans #include <math.h>
83*d0e79aa3SJason Evans #ifdef _WIN32
84*d0e79aa3SJason Evans #  include <windows.h>
85a4bd5210SJason Evansdiff --git a/include/jemalloc/internal/mutex.h b/include/jemalloc/internal/mutex.h
86*d0e79aa3SJason Evansindex f051f29..561378f 100644
87a4bd5210SJason Evans--- a/include/jemalloc/internal/mutex.h
88a4bd5210SJason Evans+++ b/include/jemalloc/internal/mutex.h
89*d0e79aa3SJason Evans@@ -47,15 +47,13 @@ struct malloc_mutex_s {
90a4bd5210SJason Evans
91a4bd5210SJason Evans #ifdef JEMALLOC_LAZY_LOCK
92a4bd5210SJason Evans extern bool isthreaded;
93a4bd5210SJason Evans-#else
948ed34ab0SJason Evans-#  undef isthreaded /* Undo private_namespace.h definition. */
95a4bd5210SJason Evans-#  define isthreaded true
96a4bd5210SJason Evans #endif
97a4bd5210SJason Evans
98a4bd5210SJason Evans bool	malloc_mutex_init(malloc_mutex_t *mutex);
99*d0e79aa3SJason Evans void	malloc_mutex_prefork(malloc_mutex_t *mutex);
100*d0e79aa3SJason Evans void	malloc_mutex_postfork_parent(malloc_mutex_t *mutex);
101*d0e79aa3SJason Evans void	malloc_mutex_postfork_child(malloc_mutex_t *mutex);
102*d0e79aa3SJason Evans+bool	malloc_mutex_first_thread(void);
103*d0e79aa3SJason Evans bool	mutex_boot(void);
104*d0e79aa3SJason Evans
105*d0e79aa3SJason Evans #endif /* JEMALLOC_H_EXTERNS */
106f921d10fSJason Evansdiff --git a/include/jemalloc/internal/private_symbols.txt b/include/jemalloc/internal/private_symbols.txt
107*d0e79aa3SJason Evansindex dbf6aa7..f87dba8 100644
108f921d10fSJason Evans--- a/include/jemalloc/internal/private_symbols.txt
109f921d10fSJason Evans+++ b/include/jemalloc/internal/private_symbols.txt
110*d0e79aa3SJason Evans@@ -277,7 +277,6 @@ iralloct_realign
111f921d10fSJason Evans isalloc
112*d0e79aa3SJason Evans isdalloct
113*d0e79aa3SJason Evans isqalloc
114f921d10fSJason Evans-isthreaded
115f921d10fSJason Evans ivsalloc
116f921d10fSJason Evans ixalloc
117f921d10fSJason Evans jemalloc_postfork_child
118a4bd5210SJason Evansdiff --git a/include/jemalloc/jemalloc_FreeBSD.h b/include/jemalloc/jemalloc_FreeBSD.h
119a4bd5210SJason Evansnew file mode 100644
120*d0e79aa3SJason Evansindex 0000000..66d6da5
121a4bd5210SJason Evans--- /dev/null
122a4bd5210SJason Evans+++ b/include/jemalloc/jemalloc_FreeBSD.h
123*d0e79aa3SJason Evans@@ -0,0 +1,137 @@
124a4bd5210SJason Evans+/*
125a4bd5210SJason Evans+ * Override settings that were generated in jemalloc_defs.h as necessary.
126a4bd5210SJason Evans+ */
127a4bd5210SJason Evans+
128a4bd5210SJason Evans+#undef JEMALLOC_OVERRIDE_VALLOC
129a4bd5210SJason Evans+
130a4bd5210SJason Evans+#ifndef MALLOC_PRODUCTION
131a4bd5210SJason Evans+#define	JEMALLOC_DEBUG
132a4bd5210SJason Evans+#endif
133a4bd5210SJason Evans+
134a4bd5210SJason Evans+/*
135a4bd5210SJason Evans+ * The following are architecture-dependent, so conditionally define them for
136a4bd5210SJason Evans+ * each supported architecture.
137a4bd5210SJason Evans+ */
138a4bd5210SJason Evans+#undef CPU_SPINWAIT
139a4bd5210SJason Evans+#undef JEMALLOC_TLS_MODEL
140a4bd5210SJason Evans+#undef STATIC_PAGE_SHIFT
141a4bd5210SJason Evans+#undef LG_SIZEOF_PTR
142a4bd5210SJason Evans+#undef LG_SIZEOF_INT
143a4bd5210SJason Evans+#undef LG_SIZEOF_LONG
144a4bd5210SJason Evans+#undef LG_SIZEOF_INTMAX_T
145a4bd5210SJason Evans+
146a4bd5210SJason Evans+#ifdef __i386__
147a4bd5210SJason Evans+#  define LG_SIZEOF_PTR		2
148a4bd5210SJason Evans+#  define CPU_SPINWAIT		__asm__ volatile("pause")
149a4bd5210SJason Evans+#  define JEMALLOC_TLS_MODEL	__attribute__((tls_model("initial-exec")))
150a4bd5210SJason Evans+#endif
151a4bd5210SJason Evans+#ifdef __ia64__
152a4bd5210SJason Evans+#  define LG_SIZEOF_PTR		3
153a4bd5210SJason Evans+#endif
154a4bd5210SJason Evans+#ifdef __sparc64__
155a4bd5210SJason Evans+#  define LG_SIZEOF_PTR		3
156a4bd5210SJason Evans+#  define JEMALLOC_TLS_MODEL	__attribute__((tls_model("initial-exec")))
157a4bd5210SJason Evans+#endif
158a4bd5210SJason Evans+#ifdef __amd64__
159a4bd5210SJason Evans+#  define LG_SIZEOF_PTR		3
160a4bd5210SJason Evans+#  define CPU_SPINWAIT		__asm__ volatile("pause")
161a4bd5210SJason Evans+#  define JEMALLOC_TLS_MODEL	__attribute__((tls_model("initial-exec")))
162a4bd5210SJason Evans+#endif
163a4bd5210SJason Evans+#ifdef __arm__
164a4bd5210SJason Evans+#  define LG_SIZEOF_PTR		2
165a4bd5210SJason Evans+#endif
166a4bd5210SJason Evans+#ifdef __mips__
167e722f8f8SJason Evans+#ifdef __mips_n64
168e722f8f8SJason Evans+#  define LG_SIZEOF_PTR		3
169e722f8f8SJason Evans+#else
170a4bd5210SJason Evans+#  define LG_SIZEOF_PTR		2
171a4bd5210SJason Evans+#endif
172e722f8f8SJason Evans+#endif
173a4bd5210SJason Evans+#ifdef __powerpc64__
174a4bd5210SJason Evans+#  define LG_SIZEOF_PTR		3
175a4bd5210SJason Evans+#elif defined(__powerpc__)
176a4bd5210SJason Evans+#  define LG_SIZEOF_PTR		2
177a4bd5210SJason Evans+#endif
178a4bd5210SJason Evans+
179a4bd5210SJason Evans+#ifndef JEMALLOC_TLS_MODEL
180a4bd5210SJason Evans+#  define JEMALLOC_TLS_MODEL	/* Default. */
181a4bd5210SJason Evans+#endif
182a4bd5210SJason Evans+
183a4bd5210SJason Evans+#define	STATIC_PAGE_SHIFT	PAGE_SHIFT
184a4bd5210SJason Evans+#define	LG_SIZEOF_INT		2
185a4bd5210SJason Evans+#define	LG_SIZEOF_LONG		LG_SIZEOF_PTR
186a4bd5210SJason Evans+#define	LG_SIZEOF_INTMAX_T	3
187a4bd5210SJason Evans+
188a4bd5210SJason Evans+/* Disable lazy-lock machinery, mangle isthreaded, and adjust its type. */
189a4bd5210SJason Evans+#undef JEMALLOC_LAZY_LOCK
190a4bd5210SJason Evans+extern int __isthreaded;
191a4bd5210SJason Evans+#define	isthreaded		((bool)__isthreaded)
192a4bd5210SJason Evans+
193a4bd5210SJason Evans+/* Mangle. */
194f8ca2db1SJason Evans+#undef je_malloc
195f8ca2db1SJason Evans+#undef je_calloc
196f8ca2db1SJason Evans+#undef je_realloc
197f8ca2db1SJason Evans+#undef je_free
198f8ca2db1SJason Evans+#undef je_posix_memalign
199*d0e79aa3SJason Evans+#undef je_aligned_alloc
200f8ca2db1SJason Evans+#undef je_malloc_usable_size
201f921d10fSJason Evans+#undef je_mallocx
202f921d10fSJason Evans+#undef je_rallocx
203f921d10fSJason Evans+#undef je_xallocx
204f921d10fSJason Evans+#undef je_sallocx
205f921d10fSJason Evans+#undef je_dallocx
206f921d10fSJason Evans+#undef je_nallocx
207f8ca2db1SJason Evans+#undef je_allocm
208f8ca2db1SJason Evans+#undef je_rallocm
209f8ca2db1SJason Evans+#undef je_sallocm
210f8ca2db1SJason Evans+#undef je_dallocm
211f8ca2db1SJason Evans+#undef je_nallocm
212f8ca2db1SJason Evans+#define	je_malloc		__malloc
213f8ca2db1SJason Evans+#define	je_calloc		__calloc
214f8ca2db1SJason Evans+#define	je_realloc		__realloc
215f8ca2db1SJason Evans+#define	je_free			__free
216f8ca2db1SJason Evans+#define	je_posix_memalign	__posix_memalign
217*d0e79aa3SJason Evans+#define	je_aligned_alloc	__aligned_alloc
218f8ca2db1SJason Evans+#define	je_malloc_usable_size	__malloc_usable_size
219f921d10fSJason Evans+#define	je_mallocx		__mallocx
220f921d10fSJason Evans+#define	je_rallocx		__rallocx
221f921d10fSJason Evans+#define	je_xallocx		__xallocx
222f921d10fSJason Evans+#define	je_sallocx		__sallocx
223f921d10fSJason Evans+#define	je_dallocx		__dallocx
224f921d10fSJason Evans+#define	je_nallocx		__nallocx
225f8ca2db1SJason Evans+#define	je_allocm		__allocm
226f8ca2db1SJason Evans+#define	je_rallocm		__rallocm
227f8ca2db1SJason Evans+#define	je_sallocm		__sallocm
228f8ca2db1SJason Evans+#define	je_dallocm		__dallocm
229f8ca2db1SJason Evans+#define	je_nallocm		__nallocm
230a4bd5210SJason Evans+#define	open			_open
231a4bd5210SJason Evans+#define	read			_read
232a4bd5210SJason Evans+#define	write			_write
233a4bd5210SJason Evans+#define	close			_close
234a4bd5210SJason Evans+#define	pthread_mutex_lock	_pthread_mutex_lock
235a4bd5210SJason Evans+#define	pthread_mutex_unlock	_pthread_mutex_unlock
236f8ca2db1SJason Evans+
237f8ca2db1SJason Evans+#ifdef JEMALLOC_C_
238f8ca2db1SJason Evans+/*
239f8ca2db1SJason Evans+ * Define 'weak' symbols so that an application can have its own versions
240f8ca2db1SJason Evans+ * of malloc, calloc, realloc, free, et al.
241f8ca2db1SJason Evans+ */
242f8ca2db1SJason Evans+__weak_reference(__malloc, malloc);
243f8ca2db1SJason Evans+__weak_reference(__calloc, calloc);
244f8ca2db1SJason Evans+__weak_reference(__realloc, realloc);
245f8ca2db1SJason Evans+__weak_reference(__free, free);
246f8ca2db1SJason Evans+__weak_reference(__posix_memalign, posix_memalign);
247*d0e79aa3SJason Evans+__weak_reference(__aligned_alloc, aligned_alloc);
248f8ca2db1SJason Evans+__weak_reference(__malloc_usable_size, malloc_usable_size);
249f921d10fSJason Evans+__weak_reference(__mallocx, mallocx);
250f921d10fSJason Evans+__weak_reference(__rallocx, rallocx);
251f921d10fSJason Evans+__weak_reference(__xallocx, xallocx);
252f921d10fSJason Evans+__weak_reference(__sallocx, sallocx);
253f921d10fSJason Evans+__weak_reference(__dallocx, dallocx);
254f921d10fSJason Evans+__weak_reference(__nallocx, nallocx);
255f8ca2db1SJason Evans+__weak_reference(__allocm, allocm);
256f8ca2db1SJason Evans+__weak_reference(__rallocm, rallocm);
257f8ca2db1SJason Evans+__weak_reference(__sallocm, sallocm);
258f8ca2db1SJason Evans+__weak_reference(__dallocm, dallocm);
259f8ca2db1SJason Evans+__weak_reference(__nallocm, nallocm);
260f8ca2db1SJason Evans+#endif
261f921d10fSJason Evansdiff --git a/include/jemalloc/jemalloc_rename.sh b/include/jemalloc/jemalloc_rename.sh
262f921d10fSJason Evansindex f943891..47d032c 100755
263f921d10fSJason Evans--- a/include/jemalloc/jemalloc_rename.sh
264f921d10fSJason Evans+++ b/include/jemalloc/jemalloc_rename.sh
265f921d10fSJason Evans@@ -19,4 +19,6 @@ done
266f921d10fSJason Evans
267f921d10fSJason Evans cat <<EOF
268f921d10fSJason Evans #endif
269f8ca2db1SJason Evans+
270f921d10fSJason Evans+#include "jemalloc_FreeBSD.h"
271f921d10fSJason Evans EOF
272a4bd5210SJason Evansdiff --git a/src/jemalloc.c b/src/jemalloc.c
273*d0e79aa3SJason Evansindex ed7863b..d078a1f 100644
274a4bd5210SJason Evans--- a/src/jemalloc.c
275a4bd5210SJason Evans+++ b/src/jemalloc.c
276*d0e79aa3SJason Evans@@ -4,6 +4,10 @@
277*d0e79aa3SJason Evans /******************************************************************************/
278*d0e79aa3SJason Evans /* Data. */
279a4bd5210SJason Evans
280e722f8f8SJason Evans+/* Work around <http://llvm.org/bugs/show_bug.cgi?id=12623>: */
281e722f8f8SJason Evans+const char	*__malloc_options_1_0 = NULL;
282a4bd5210SJason Evans+__sym_compat(_malloc_options, __malloc_options_1_0, FBSD_1.0);
283a4bd5210SJason Evans+
284a4bd5210SJason Evans /* Runtime configuration options. */
285*d0e79aa3SJason Evans const char	*je_malloc_conf JEMALLOC_ATTR(weak);
28688ad2f8dSJason Evans bool	opt_abort =
287*d0e79aa3SJason Evans@@ -2475,6 +2479,107 @@ je_malloc_usable_size(JEMALLOC_USABLE_SIZE_CONST void *ptr)
288*d0e79aa3SJason Evans  */
289*d0e79aa3SJason Evans /******************************************************************************/
290a4bd5210SJason Evans /*
291*d0e79aa3SJason Evans+ * Begin compatibility functions.
292*d0e79aa3SJason Evans+ */
293*d0e79aa3SJason Evans+
294*d0e79aa3SJason Evans+#define	ALLOCM_LG_ALIGN(la)	(la)
295*d0e79aa3SJason Evans+#define	ALLOCM_ALIGN(a)		(ffsl(a)-1)
296*d0e79aa3SJason Evans+#define	ALLOCM_ZERO		((int)0x40)
297*d0e79aa3SJason Evans+#define	ALLOCM_NO_MOVE		((int)0x80)
298*d0e79aa3SJason Evans+
299*d0e79aa3SJason Evans+#define	ALLOCM_SUCCESS		0
300*d0e79aa3SJason Evans+#define	ALLOCM_ERR_OOM		1
301*d0e79aa3SJason Evans+#define	ALLOCM_ERR_NOT_MOVED	2
302*d0e79aa3SJason Evans+
303*d0e79aa3SJason Evans+int
304*d0e79aa3SJason Evans+je_allocm(void **ptr, size_t *rsize, size_t size, int flags)
305*d0e79aa3SJason Evans+{
306*d0e79aa3SJason Evans+	void *p;
307*d0e79aa3SJason Evans+
308*d0e79aa3SJason Evans+	assert(ptr != NULL);
309*d0e79aa3SJason Evans+
310*d0e79aa3SJason Evans+	p = je_mallocx(size, flags);
311*d0e79aa3SJason Evans+	if (p == NULL)
312*d0e79aa3SJason Evans+		return (ALLOCM_ERR_OOM);
313*d0e79aa3SJason Evans+	if (rsize != NULL)
314*d0e79aa3SJason Evans+		*rsize = isalloc(p, config_prof);
315*d0e79aa3SJason Evans+	*ptr = p;
316*d0e79aa3SJason Evans+	return (ALLOCM_SUCCESS);
317*d0e79aa3SJason Evans+}
318*d0e79aa3SJason Evans+
319*d0e79aa3SJason Evans+int
320*d0e79aa3SJason Evans+je_rallocm(void **ptr, size_t *rsize, size_t size, size_t extra, int flags)
321*d0e79aa3SJason Evans+{
322*d0e79aa3SJason Evans+	int ret;
323*d0e79aa3SJason Evans+	bool no_move = flags & ALLOCM_NO_MOVE;
324*d0e79aa3SJason Evans+
325*d0e79aa3SJason Evans+	assert(ptr != NULL);
326*d0e79aa3SJason Evans+	assert(*ptr != NULL);
327*d0e79aa3SJason Evans+	assert(size != 0);
328*d0e79aa3SJason Evans+	assert(SIZE_T_MAX - size >= extra);
329*d0e79aa3SJason Evans+
330*d0e79aa3SJason Evans+	if (no_move) {
331*d0e79aa3SJason Evans+		size_t usize = je_xallocx(*ptr, size, extra, flags);
332*d0e79aa3SJason Evans+		ret = (usize >= size) ? ALLOCM_SUCCESS : ALLOCM_ERR_NOT_MOVED;
333*d0e79aa3SJason Evans+		if (rsize != NULL)
334*d0e79aa3SJason Evans+			*rsize = usize;
335*d0e79aa3SJason Evans+	} else {
336*d0e79aa3SJason Evans+		void *p = je_rallocx(*ptr, size+extra, flags);
337*d0e79aa3SJason Evans+		if (p != NULL) {
338*d0e79aa3SJason Evans+			*ptr = p;
339*d0e79aa3SJason Evans+			ret = ALLOCM_SUCCESS;
340*d0e79aa3SJason Evans+		} else
341*d0e79aa3SJason Evans+			ret = ALLOCM_ERR_OOM;
342*d0e79aa3SJason Evans+		if (rsize != NULL)
343*d0e79aa3SJason Evans+			*rsize = isalloc(*ptr, config_prof);
344*d0e79aa3SJason Evans+	}
345*d0e79aa3SJason Evans+	return (ret);
346*d0e79aa3SJason Evans+}
347*d0e79aa3SJason Evans+
348*d0e79aa3SJason Evans+int
349*d0e79aa3SJason Evans+je_sallocm(const void *ptr, size_t *rsize, int flags)
350*d0e79aa3SJason Evans+{
351*d0e79aa3SJason Evans+
352*d0e79aa3SJason Evans+	assert(rsize != NULL);
353*d0e79aa3SJason Evans+	*rsize = je_sallocx(ptr, flags);
354*d0e79aa3SJason Evans+	return (ALLOCM_SUCCESS);
355*d0e79aa3SJason Evans+}
356*d0e79aa3SJason Evans+
357*d0e79aa3SJason Evans+int
358*d0e79aa3SJason Evans+je_dallocm(void *ptr, int flags)
359*d0e79aa3SJason Evans+{
360*d0e79aa3SJason Evans+
361*d0e79aa3SJason Evans+	je_dallocx(ptr, flags);
362*d0e79aa3SJason Evans+	return (ALLOCM_SUCCESS);
363*d0e79aa3SJason Evans+}
364*d0e79aa3SJason Evans+
365*d0e79aa3SJason Evans+int
366*d0e79aa3SJason Evans+je_nallocm(size_t *rsize, size_t size, int flags)
367*d0e79aa3SJason Evans+{
368*d0e79aa3SJason Evans+	size_t usize;
369*d0e79aa3SJason Evans+
370*d0e79aa3SJason Evans+	usize = je_nallocx(size, flags);
371*d0e79aa3SJason Evans+	if (usize == 0)
372*d0e79aa3SJason Evans+		return (ALLOCM_ERR_OOM);
373*d0e79aa3SJason Evans+	if (rsize != NULL)
374*d0e79aa3SJason Evans+		*rsize = usize;
375*d0e79aa3SJason Evans+	return (ALLOCM_SUCCESS);
376*d0e79aa3SJason Evans+}
377*d0e79aa3SJason Evans+
378*d0e79aa3SJason Evans+#undef ALLOCM_LG_ALIGN
379*d0e79aa3SJason Evans+#undef ALLOCM_ALIGN
380*d0e79aa3SJason Evans+#undef ALLOCM_ZERO
381*d0e79aa3SJason Evans+#undef ALLOCM_NO_MOVE
382*d0e79aa3SJason Evans+
383*d0e79aa3SJason Evans+#undef ALLOCM_SUCCESS
384*d0e79aa3SJason Evans+#undef ALLOCM_ERR_OOM
385*d0e79aa3SJason Evans+#undef ALLOCM_ERR_NOT_MOVED
386*d0e79aa3SJason Evans+
387*d0e79aa3SJason Evans+/*
388*d0e79aa3SJason Evans+ * End compatibility functions.
389*d0e79aa3SJason Evans+ */
390*d0e79aa3SJason Evans+/******************************************************************************/
391*d0e79aa3SJason Evans+/*
392*d0e79aa3SJason Evans  * The following functions are used by threading libraries for protection of
393*d0e79aa3SJason Evans  * malloc during fork().
394*d0e79aa3SJason Evans  */
395*d0e79aa3SJason Evans@@ -2575,4 +2680,11 @@ jemalloc_postfork_child(void)
396*d0e79aa3SJason Evans 	ctl_postfork_child();
397*d0e79aa3SJason Evans }
398*d0e79aa3SJason Evans
399*d0e79aa3SJason Evans+void
400*d0e79aa3SJason Evans+_malloc_first_thread(void)
401*d0e79aa3SJason Evans+{
402*d0e79aa3SJason Evans+
403*d0e79aa3SJason Evans+	(void)malloc_mutex_first_thread();
404*d0e79aa3SJason Evans+}
405*d0e79aa3SJason Evans+
406*d0e79aa3SJason Evans /******************************************************************************/
407a4bd5210SJason Evansdiff --git a/src/mutex.c b/src/mutex.c
408*d0e79aa3SJason Evansindex 2d47af9..934d5aa 100644
409a4bd5210SJason Evans--- a/src/mutex.c
410a4bd5210SJason Evans+++ b/src/mutex.c
411e722f8f8SJason Evans@@ -66,6 +66,17 @@ pthread_create(pthread_t *__restrict thread,
412a4bd5210SJason Evans #ifdef JEMALLOC_MUTEX_INIT_CB
41382872ac0SJason Evans JEMALLOC_EXPORT int	_pthread_mutex_init_calloc_cb(pthread_mutex_t *mutex,
414a4bd5210SJason Evans     void *(calloc_cb)(size_t, size_t));
415a4bd5210SJason Evans+
416*d0e79aa3SJason Evans+#pragma weak _pthread_mutex_init_calloc_cb
417a4bd5210SJason Evans+int
418*d0e79aa3SJason Evans+_pthread_mutex_init_calloc_cb(pthread_mutex_t *mutex,
419a4bd5210SJason Evans+    void *(calloc_cb)(size_t, size_t))
420a4bd5210SJason Evans+{
421a4bd5210SJason Evans+
422*d0e79aa3SJason Evans+	return (((int (*)(pthread_mutex_t *, void *(*)(size_t, size_t)))
423*d0e79aa3SJason Evans+	    __libc_interposing[INTERPOS__pthread_mutex_init_calloc_cb])(mutex,
424*d0e79aa3SJason Evans+	    calloc_cb));
425a4bd5210SJason Evans+}
426a4bd5210SJason Evans #endif
427a4bd5210SJason Evans
428a4bd5210SJason Evans bool
429*d0e79aa3SJason Evans@@ -137,7 +148,7 @@ malloc_mutex_postfork_child(malloc_mutex_t *mutex)
430*d0e79aa3SJason Evans }
431*d0e79aa3SJason Evans
432*d0e79aa3SJason Evans bool
433*d0e79aa3SJason Evans-mutex_boot(void)
434*d0e79aa3SJason Evans+malloc_mutex_first_thread(void)
435*d0e79aa3SJason Evans {
436*d0e79aa3SJason Evans
437*d0e79aa3SJason Evans #ifdef JEMALLOC_MUTEX_INIT_CB
438*d0e79aa3SJason Evans@@ -151,3 +162,14 @@ mutex_boot(void)
439*d0e79aa3SJason Evans #endif
440*d0e79aa3SJason Evans 	return (false);
441*d0e79aa3SJason Evans }
442*d0e79aa3SJason Evans+
443*d0e79aa3SJason Evans+bool
444*d0e79aa3SJason Evans+mutex_boot(void)
445*d0e79aa3SJason Evans+{
446*d0e79aa3SJason Evans+
447*d0e79aa3SJason Evans+#ifndef JEMALLOC_MUTEX_INIT_CB
448*d0e79aa3SJason Evans+	return (malloc_mutex_first_thread());
449*d0e79aa3SJason Evans+#else
450*d0e79aa3SJason Evans+	return (false);
451*d0e79aa3SJason Evans+#endif
452*d0e79aa3SJason Evans+}
453a4bd5210SJason Evansdiff --git a/src/util.c b/src/util.c
454*d0e79aa3SJason Evansindex 4cb0d6c..25b61c2 100644
455a4bd5210SJason Evans--- a/src/util.c
456a4bd5210SJason Evans+++ b/src/util.c
457e722f8f8SJason Evans@@ -58,6 +58,22 @@ wrtmessage(void *cbopaque, const char *s)
458a4bd5210SJason Evans
459e722f8f8SJason Evans JEMALLOC_EXPORT void	(*je_malloc_message)(void *, const char *s);
460e722f8f8SJason Evans
461e722f8f8SJason Evans+JEMALLOC_ATTR(visibility("hidden"))
462a4bd5210SJason Evans+void
463a4bd5210SJason Evans+wrtmessage_1_0(const char *s1, const char *s2, const char *s3,
464a4bd5210SJason Evans+    const char *s4)
465a4bd5210SJason Evans+{
466a4bd5210SJason Evans+
467a4bd5210SJason Evans+	wrtmessage(NULL, s1);
468a4bd5210SJason Evans+	wrtmessage(NULL, s2);
469a4bd5210SJason Evans+	wrtmessage(NULL, s3);
470a4bd5210SJason Evans+	wrtmessage(NULL, s4);
471a4bd5210SJason Evans+}
472a4bd5210SJason Evans+
473a4bd5210SJason Evans+void	(*__malloc_message_1_0)(const char *s1, const char *s2, const char *s3,
474a4bd5210SJason Evans+    const char *s4) = wrtmessage_1_0;
475a4bd5210SJason Evans+__sym_compat(_malloc_message, __malloc_message_1_0, FBSD_1.0);
476a4bd5210SJason Evans+
477a4bd5210SJason Evans /*
478e722f8f8SJason Evans  * Wrapper around malloc_message() that avoids the need for
479e722f8f8SJason Evans  * je_malloc_message(...) throughout the code.
480