xref: /freebsd/contrib/jemalloc/FREEBSD-diffs (revision b7eaed250fccfdef218a62bc2d0af529ad75341c)
1a4bd5210SJason Evansdiff --git a/doc/jemalloc.xml.in b/doc/jemalloc.xml.in
2*b7eaed25SJason Evansindex 21e401ac..f977c5f5 100644
3a4bd5210SJason Evans--- a/doc/jemalloc.xml.in
4a4bd5210SJason Evans+++ b/doc/jemalloc.xml.in
5*b7eaed25SJason Evans@@ -53,11 +53,21 @@
6a4bd5210SJason Evans     <para>This manual describes jemalloc @jemalloc_version@.  More information
7a4bd5210SJason Evans     can be found at the <ulink
8bde95144SJason Evans     url="http://jemalloc.net/">jemalloc website</ulink>.</para>
9a4bd5210SJason Evans+
10a4bd5210SJason Evans+    <para>The following configuration options are enabled in libc's built-in
11d0e79aa3SJason Evans+    jemalloc: <option>--enable-fill</option>,
12*b7eaed25SJason Evans+    <option>--enable-lazy-lock</option>, <option>--enable-stats</option>,
13*b7eaed25SJason Evans+    <option>--enable-utrace</option>, and <option>--enable-xmalloc</option>.
14*b7eaed25SJason Evans+    Additionally, <option>--enable-debug</option> is enabled in development
15*b7eaed25SJason Evans+    versions of FreeBSD (controlled by the
16*b7eaed25SJason Evans+    <constant>MALLOC_PRODUCTION</constant> make variable).</para>
17d0e79aa3SJason Evans+
18a4bd5210SJason Evans   </refsect1>
19a4bd5210SJason Evans   <refsynopsisdiv>
20a4bd5210SJason Evans     <title>SYNOPSIS</title>
21c13244b9SJason Evans     <funcsynopsis>
22c13244b9SJason Evans-      <funcsynopsisinfo>#include &lt;<filename class="headerfile">jemalloc/jemalloc.h</filename>&gt;</funcsynopsisinfo>
23c13244b9SJason Evans+      <funcsynopsisinfo>#include &lt;<filename class="headerfile">stdlib.h</filename>&gt;
24c13244b9SJason Evans+#include &lt;<filename class="headerfile">malloc_np.h</filename>&gt;</funcsynopsisinfo>
25c13244b9SJason Evans       <refsect2>
26c13244b9SJason Evans         <title>Standard API</title>
27c13244b9SJason Evans         <funcprototype>
28*b7eaed25SJason Evans@@ -3252,4 +3262,18 @@ malloc_conf = "narenas:1";]]></programlisting></para>
29bde95144SJason Evans     <para>The <function>posix_memalign()</function> function conforms
30bde95144SJason Evans     to IEEE Std 1003.1-2001 (<quote>POSIX.1</quote>).</para>
31a4bd5210SJason Evans   </refsect1>
32a4bd5210SJason Evans+  <refsect1 id="history">
33a4bd5210SJason Evans+    <title>HISTORY</title>
34bde95144SJason Evans+    <para>The <function>malloc_usable_size()</function> and
35bde95144SJason Evans+    <function>posix_memalign()</function> functions first appeared in FreeBSD
36bde95144SJason Evans+    7.0.</para>
37a4bd5210SJason Evans+
38bde95144SJason Evans+    <para>The <function>aligned_alloc()</function>,
39bde95144SJason Evans+    <function>malloc_stats_print()</function>, and
40bde95144SJason Evans+    <function>mallctl*()</function> functions first appeared in FreeBSD
41bde95144SJason Evans+    10.0.</para>
42f921d10fSJason Evans+
43bde95144SJason Evans+    <para>The <function>*allocx()</function> functions first appeared in FreeBSD
44bde95144SJason Evans+    11.0.</para>
45a4bd5210SJason Evans+  </refsect1>
46a4bd5210SJason Evans </refentry>
47*b7eaed25SJason Evansdiff --git a/include/jemalloc/internal/hooks.h b/include/jemalloc/internal/hooks.h
48*b7eaed25SJason Evansindex cd49afcb..85e2a991 100644
49*b7eaed25SJason Evans--- a/include/jemalloc/internal/hooks.h
50*b7eaed25SJason Evans+++ b/include/jemalloc/internal/hooks.h
51*b7eaed25SJason Evans@@ -6,13 +6,6 @@ extern JEMALLOC_EXPORT void (*hooks_libc_hook)();
52fbb1d85eSJason Evans
53*b7eaed25SJason Evans #define JEMALLOC_HOOK(fn, hook) ((void)(hook != NULL && (hook(), 0)), fn)
54fbb1d85eSJason Evans
55*b7eaed25SJason Evans-#define open JEMALLOC_HOOK(open, hooks_libc_hook)
56*b7eaed25SJason Evans-#define read JEMALLOC_HOOK(read, hooks_libc_hook)
57*b7eaed25SJason Evans-#define write JEMALLOC_HOOK(write, hooks_libc_hook)
58*b7eaed25SJason Evans-#define readlink JEMALLOC_HOOK(readlink, hooks_libc_hook)
59*b7eaed25SJason Evans-#define close JEMALLOC_HOOK(close, hooks_libc_hook)
60*b7eaed25SJason Evans-#define creat JEMALLOC_HOOK(creat, hooks_libc_hook)
61*b7eaed25SJason Evans-#define secure_getenv JEMALLOC_HOOK(secure_getenv, hooks_libc_hook)
62*b7eaed25SJason Evans /* Note that this is undef'd and re-define'd in src/prof.c. */
63*b7eaed25SJason Evans #define _Unwind_Backtrace JEMALLOC_HOOK(_Unwind_Backtrace, hooks_libc_hook)
64fbb1d85eSJason Evans
65*b7eaed25SJason Evansdiff --git a/include/jemalloc/internal/jemalloc_internal_decls.h b/include/jemalloc/internal/jemalloc_internal_decls.h
66*b7eaed25SJason Evansindex 1efdb56b..12a7e5a8 100644
67*b7eaed25SJason Evans--- a/include/jemalloc/internal/jemalloc_internal_decls.h
68*b7eaed25SJason Evans+++ b/include/jemalloc/internal/jemalloc_internal_decls.h
69*b7eaed25SJason Evans@@ -1,6 +1,9 @@
70*b7eaed25SJason Evans #ifndef JEMALLOC_INTERNAL_DECLS_H
71*b7eaed25SJason Evans #define JEMALLOC_INTERNAL_DECLS_H
72fbb1d85eSJason Evans
73*b7eaed25SJason Evans+#include "libc_private.h"
74*b7eaed25SJason Evans+#include "namespace.h"
75*b7eaed25SJason Evans+
76*b7eaed25SJason Evans #include <math.h>
77*b7eaed25SJason Evans #ifdef _WIN32
78*b7eaed25SJason Evans #  include <windows.h>
79*b7eaed25SJason Evansdiff --git a/include/jemalloc/internal/jemalloc_preamble.h.in b/include/jemalloc/internal/jemalloc_preamble.h.in
80*b7eaed25SJason Evansindex 18539a09..c8af8683 100644
81*b7eaed25SJason Evans--- a/include/jemalloc/internal/jemalloc_preamble.h.in
82*b7eaed25SJason Evans+++ b/include/jemalloc/internal/jemalloc_preamble.h.in
83d0e79aa3SJason Evans@@ -8,6 +8,9 @@
84d0e79aa3SJason Evans #include <sys/ktrace.h>
85e722f8f8SJason Evans #endif
86a4bd5210SJason Evans
87a4bd5210SJason Evans+#include "un-namespace.h"
88a4bd5210SJason Evans+#include "libc_private.h"
89a4bd5210SJason Evans+
90a4bd5210SJason Evans #define JEMALLOC_NO_DEMANGLE
91f921d10fSJason Evans #ifdef JEMALLOC_JET
92*b7eaed25SJason Evans #  undef JEMALLOC_IS_MALLOC
93*b7eaed25SJason Evans@@ -68,13 +71,7 @@ static const bool config_fill =
94edaa25bdSJason Evans     false
95edaa25bdSJason Evans #endif
96edaa25bdSJason Evans     ;
97edaa25bdSJason Evans-static const bool config_lazy_lock =
98edaa25bdSJason Evans-#ifdef JEMALLOC_LAZY_LOCK
99edaa25bdSJason Evans-    true
100edaa25bdSJason Evans-#else
101edaa25bdSJason Evans-    false
102edaa25bdSJason Evans-#endif
103edaa25bdSJason Evans-    ;
104edaa25bdSJason Evans+static const bool config_lazy_lock = true;
105df0d881dSJason Evans static const char * const config_malloc_conf = JEMALLOC_CONFIG_MALLOC_CONF;
106edaa25bdSJason Evans static const bool config_prof =
107edaa25bdSJason Evans #ifdef JEMALLOC_PROF
108a4bd5210SJason Evansdiff --git a/include/jemalloc/internal/mutex.h b/include/jemalloc/internal/mutex.h
109*b7eaed25SJason Evansindex 6520c251..0013cbe9 100644
110a4bd5210SJason Evans--- a/include/jemalloc/internal/mutex.h
111a4bd5210SJason Evans+++ b/include/jemalloc/internal/mutex.h
112*b7eaed25SJason Evans@@ -121,9 +121,6 @@ struct malloc_mutex_s {
113a4bd5210SJason Evans
114a4bd5210SJason Evans #ifdef JEMALLOC_LAZY_LOCK
115a4bd5210SJason Evans extern bool isthreaded;
116a4bd5210SJason Evans-#else
1178ed34ab0SJason Evans-#  undef isthreaded /* Undo private_namespace.h definition. */
118a4bd5210SJason Evans-#  define isthreaded true
119a4bd5210SJason Evans #endif
120a4bd5210SJason Evans
1211f0a49e8SJason Evans bool malloc_mutex_init(malloc_mutex_t *mutex, const char *name,
122*b7eaed25SJason Evans@@ -131,6 +128,7 @@ bool malloc_mutex_init(malloc_mutex_t *mutex, const char *name,
1231f0a49e8SJason Evans void malloc_mutex_prefork(tsdn_t *tsdn, malloc_mutex_t *mutex);
1241f0a49e8SJason Evans void malloc_mutex_postfork_parent(tsdn_t *tsdn, malloc_mutex_t *mutex);
1251f0a49e8SJason Evans void malloc_mutex_postfork_child(tsdn_t *tsdn, malloc_mutex_t *mutex);
126d0e79aa3SJason Evans+bool malloc_mutex_first_thread(void);
1271f0a49e8SJason Evans bool malloc_mutex_boot(void);
128*b7eaed25SJason Evans void malloc_mutex_prof_data_reset(tsdn_t *tsdn, malloc_mutex_t *mutex);
129d0e79aa3SJason Evans
130a4bd5210SJason Evansdiff --git a/include/jemalloc/jemalloc_FreeBSD.h b/include/jemalloc/jemalloc_FreeBSD.h
131a4bd5210SJason Evansnew file mode 100644
132*b7eaed25SJason Evansindex 00000000..355b565c
133a4bd5210SJason Evans--- /dev/null
134a4bd5210SJason Evans+++ b/include/jemalloc/jemalloc_FreeBSD.h
135*b7eaed25SJason Evans@@ -0,0 +1,185 @@
136a4bd5210SJason Evans+/*
137a4bd5210SJason Evans+ * Override settings that were generated in jemalloc_defs.h as necessary.
138a4bd5210SJason Evans+ */
139a4bd5210SJason Evans+
140a4bd5210SJason Evans+#undef JEMALLOC_OVERRIDE_VALLOC
141a4bd5210SJason Evans+
142a4bd5210SJason Evans+#ifndef MALLOC_PRODUCTION
143a4bd5210SJason Evans+#define	JEMALLOC_DEBUG
144a4bd5210SJason Evans+#endif
145a4bd5210SJason Evans+
1461f0a49e8SJason Evans+#undef JEMALLOC_DSS
1471f0a49e8SJason Evans+
148*b7eaed25SJason Evans+#undef JEMALLOC_BACKGROUND_THREAD
149*b7eaed25SJason Evans+
150a4bd5210SJason Evans+/*
151a4bd5210SJason Evans+ * The following are architecture-dependent, so conditionally define them for
152a4bd5210SJason Evans+ * each supported architecture.
153a4bd5210SJason Evans+ */
154a4bd5210SJason Evans+#undef JEMALLOC_TLS_MODEL
155a4bd5210SJason Evans+#undef STATIC_PAGE_SHIFT
156*b7eaed25SJason Evans+#undef LG_VADDR
157a4bd5210SJason Evans+#undef LG_SIZEOF_PTR
158a4bd5210SJason Evans+#undef LG_SIZEOF_INT
159a4bd5210SJason Evans+#undef LG_SIZEOF_LONG
160a4bd5210SJason Evans+#undef LG_SIZEOF_INTMAX_T
161a4bd5210SJason Evans+
162a4bd5210SJason Evans+#ifdef __i386__
163*b7eaed25SJason Evans+#  define LG_VADDR		32
164a4bd5210SJason Evans+#  define LG_SIZEOF_PTR		2
165a4bd5210SJason Evans+#  define JEMALLOC_TLS_MODEL	__attribute__((tls_model("initial-exec")))
166a4bd5210SJason Evans+#endif
167a4bd5210SJason Evans+#ifdef __ia64__
168*b7eaed25SJason Evans+#  define LG_VADDR		64
169a4bd5210SJason Evans+#  define LG_SIZEOF_PTR		3
170a4bd5210SJason Evans+#endif
171a4bd5210SJason Evans+#ifdef __sparc64__
172*b7eaed25SJason Evans+#  define LG_VADDR		64
173a4bd5210SJason Evans+#  define LG_SIZEOF_PTR		3
174a4bd5210SJason Evans+#  define JEMALLOC_TLS_MODEL	__attribute__((tls_model("initial-exec")))
175a4bd5210SJason Evans+#endif
176a4bd5210SJason Evans+#ifdef __amd64__
177*b7eaed25SJason Evans+#  define LG_VADDR		48
178a4bd5210SJason Evans+#  define LG_SIZEOF_PTR		3
179a4bd5210SJason Evans+#  define JEMALLOC_TLS_MODEL	__attribute__((tls_model("initial-exec")))
180a4bd5210SJason Evans+#endif
181a4bd5210SJason Evans+#ifdef __arm__
182*b7eaed25SJason Evans+#  define LG_VADDR		32
183a4bd5210SJason Evans+#  define LG_SIZEOF_PTR		2
184a4bd5210SJason Evans+#endif
185d8e39d2dSJason Evans+#ifdef __aarch64__
186*b7eaed25SJason Evans+#  define LG_VADDR		48
187d8e39d2dSJason Evans+#  define LG_SIZEOF_PTR		3
188d8e39d2dSJason Evans+#endif
189a4bd5210SJason Evans+#ifdef __mips__
190e722f8f8SJason Evans+#ifdef __mips_n64
191*b7eaed25SJason Evans+#  define LG_VADDR		64
192e722f8f8SJason Evans+#  define LG_SIZEOF_PTR		3
193e722f8f8SJason Evans+#else
194*b7eaed25SJason Evans+#  define LG_VADDR		32
195a4bd5210SJason Evans+#  define LG_SIZEOF_PTR		2
196a4bd5210SJason Evans+#endif
197e722f8f8SJason Evans+#endif
198a4bd5210SJason Evans+#ifdef __powerpc64__
199*b7eaed25SJason Evans+#  define LG_VADDR		64
200a4bd5210SJason Evans+#  define LG_SIZEOF_PTR		3
201a4bd5210SJason Evans+#elif defined(__powerpc__)
202*b7eaed25SJason Evans+#  define LG_VADDR		32
203a4bd5210SJason Evans+#  define LG_SIZEOF_PTR		2
204a4bd5210SJason Evans+#endif
205df0d881dSJason Evans+#ifdef __riscv__
206*b7eaed25SJason Evans+#  define LG_VADDR		64
207df0d881dSJason Evans+#  define LG_SIZEOF_PTR		3
208df0d881dSJason Evans+#endif
209a4bd5210SJason Evans+
210a4bd5210SJason Evans+#ifndef JEMALLOC_TLS_MODEL
211a4bd5210SJason Evans+#  define JEMALLOC_TLS_MODEL	/* Default. */
212a4bd5210SJason Evans+#endif
213a4bd5210SJason Evans+
214a4bd5210SJason Evans+#define	STATIC_PAGE_SHIFT	PAGE_SHIFT
215a4bd5210SJason Evans+#define	LG_SIZEOF_INT		2
216a4bd5210SJason Evans+#define	LG_SIZEOF_LONG		LG_SIZEOF_PTR
217a4bd5210SJason Evans+#define	LG_SIZEOF_INTMAX_T	3
218a4bd5210SJason Evans+
219337776f8SJason Evans+#undef CPU_SPINWAIT
220337776f8SJason Evans+#include <machine/cpu.h>
221337776f8SJason Evans+#include <machine/cpufunc.h>
222337776f8SJason Evans+#define	CPU_SPINWAIT		cpu_spinwait()
223337776f8SJason Evans+
224a4bd5210SJason Evans+/* Disable lazy-lock machinery, mangle isthreaded, and adjust its type. */
225a4bd5210SJason Evans+#undef JEMALLOC_LAZY_LOCK
226a4bd5210SJason Evans+extern int __isthreaded;
227a4bd5210SJason Evans+#define	isthreaded		((bool)__isthreaded)
228a4bd5210SJason Evans+
229a4bd5210SJason Evans+/* Mangle. */
230f8ca2db1SJason Evans+#undef je_malloc
231f8ca2db1SJason Evans+#undef je_calloc
232f8ca2db1SJason Evans+#undef je_posix_memalign
233d0e79aa3SJason Evans+#undef je_aligned_alloc
234df0d881dSJason Evans+#undef je_realloc
235df0d881dSJason Evans+#undef je_free
236f8ca2db1SJason Evans+#undef je_malloc_usable_size
237f921d10fSJason Evans+#undef je_mallocx
238f921d10fSJason Evans+#undef je_rallocx
239f921d10fSJason Evans+#undef je_xallocx
240f921d10fSJason Evans+#undef je_sallocx
241f921d10fSJason Evans+#undef je_dallocx
242df0d881dSJason Evans+#undef je_sdallocx
243f921d10fSJason Evans+#undef je_nallocx
244df0d881dSJason Evans+#undef je_mallctl
245df0d881dSJason Evans+#undef je_mallctlnametomib
246df0d881dSJason Evans+#undef je_mallctlbymib
247df0d881dSJason Evans+#undef je_malloc_stats_print
248f8ca2db1SJason Evans+#undef je_allocm
249f8ca2db1SJason Evans+#undef je_rallocm
250f8ca2db1SJason Evans+#undef je_sallocm
251f8ca2db1SJason Evans+#undef je_dallocm
252f8ca2db1SJason Evans+#undef je_nallocm
253f8ca2db1SJason Evans+#define	je_malloc		__malloc
254f8ca2db1SJason Evans+#define	je_calloc		__calloc
255f8ca2db1SJason Evans+#define	je_posix_memalign	__posix_memalign
256d0e79aa3SJason Evans+#define	je_aligned_alloc	__aligned_alloc
257df0d881dSJason Evans+#define	je_realloc		__realloc
258df0d881dSJason Evans+#define	je_free			__free
259f8ca2db1SJason Evans+#define	je_malloc_usable_size	__malloc_usable_size
260f921d10fSJason Evans+#define	je_mallocx		__mallocx
261f921d10fSJason Evans+#define	je_rallocx		__rallocx
262f921d10fSJason Evans+#define	je_xallocx		__xallocx
263f921d10fSJason Evans+#define	je_sallocx		__sallocx
264f921d10fSJason Evans+#define	je_dallocx		__dallocx
265df0d881dSJason Evans+#define	je_sdallocx		__sdallocx
266f921d10fSJason Evans+#define	je_nallocx		__nallocx
267df0d881dSJason Evans+#define	je_mallctl		__mallctl
268df0d881dSJason Evans+#define	je_mallctlnametomib	__mallctlnametomib
269df0d881dSJason Evans+#define	je_mallctlbymib		__mallctlbymib
270df0d881dSJason Evans+#define	je_malloc_stats_print	__malloc_stats_print
271f8ca2db1SJason Evans+#define	je_allocm		__allocm
272f8ca2db1SJason Evans+#define	je_rallocm		__rallocm
273f8ca2db1SJason Evans+#define	je_sallocm		__sallocm
274f8ca2db1SJason Evans+#define	je_dallocm		__dallocm
275f8ca2db1SJason Evans+#define	je_nallocm		__nallocm
276a4bd5210SJason Evans+#define	open			_open
277a4bd5210SJason Evans+#define	read			_read
278a4bd5210SJason Evans+#define	write			_write
279a4bd5210SJason Evans+#define	close			_close
280*b7eaed25SJason Evans+#define	pthread_join		_pthread_join
281*b7eaed25SJason Evans+#define	pthread_once		_pthread_once
282*b7eaed25SJason Evans+#define	pthread_self		_pthread_self
283*b7eaed25SJason Evans+#define	pthread_equal		_pthread_equal
284a4bd5210SJason Evans+#define	pthread_mutex_lock	_pthread_mutex_lock
285*b7eaed25SJason Evans+#define	pthread_mutex_trylock	_pthread_mutex_trylock
286a4bd5210SJason Evans+#define	pthread_mutex_unlock	_pthread_mutex_unlock
287*b7eaed25SJason Evans+#define	pthread_cond_init	_pthread_cond_init
288*b7eaed25SJason Evans+#define	pthread_cond_wait	_pthread_cond_wait
289*b7eaed25SJason Evans+#define	pthread_cond_timedwait	_pthread_cond_timedwait
290*b7eaed25SJason Evans+#define	pthread_cond_signal	_pthread_cond_signal
291f8ca2db1SJason Evans+
292f8ca2db1SJason Evans+#ifdef JEMALLOC_C_
293f8ca2db1SJason Evans+/*
294f8ca2db1SJason Evans+ * Define 'weak' symbols so that an application can have its own versions
295f8ca2db1SJason Evans+ * of malloc, calloc, realloc, free, et al.
296f8ca2db1SJason Evans+ */
297f8ca2db1SJason Evans+__weak_reference(__malloc, malloc);
298f8ca2db1SJason Evans+__weak_reference(__calloc, calloc);
299f8ca2db1SJason Evans+__weak_reference(__posix_memalign, posix_memalign);
300d0e79aa3SJason Evans+__weak_reference(__aligned_alloc, aligned_alloc);
301df0d881dSJason Evans+__weak_reference(__realloc, realloc);
302df0d881dSJason Evans+__weak_reference(__free, free);
303f8ca2db1SJason Evans+__weak_reference(__malloc_usable_size, malloc_usable_size);
304f921d10fSJason Evans+__weak_reference(__mallocx, mallocx);
305f921d10fSJason Evans+__weak_reference(__rallocx, rallocx);
306f921d10fSJason Evans+__weak_reference(__xallocx, xallocx);
307f921d10fSJason Evans+__weak_reference(__sallocx, sallocx);
308f921d10fSJason Evans+__weak_reference(__dallocx, dallocx);
309df0d881dSJason Evans+__weak_reference(__sdallocx, sdallocx);
310f921d10fSJason Evans+__weak_reference(__nallocx, nallocx);
311df0d881dSJason Evans+__weak_reference(__mallctl, mallctl);
312df0d881dSJason Evans+__weak_reference(__mallctlnametomib, mallctlnametomib);
313df0d881dSJason Evans+__weak_reference(__mallctlbymib, mallctlbymib);
314df0d881dSJason Evans+__weak_reference(__malloc_stats_print, malloc_stats_print);
315f8ca2db1SJason Evans+__weak_reference(__allocm, allocm);
316f8ca2db1SJason Evans+__weak_reference(__rallocm, rallocm);
317f8ca2db1SJason Evans+__weak_reference(__sallocm, sallocm);
318f8ca2db1SJason Evans+__weak_reference(__dallocm, dallocm);
319f8ca2db1SJason Evans+__weak_reference(__nallocm, nallocm);
320f8ca2db1SJason Evans+#endif
321f921d10fSJason Evansdiff --git a/include/jemalloc/jemalloc_rename.sh b/include/jemalloc/jemalloc_rename.sh
322*b7eaed25SJason Evansindex f9438912..47d032c1 100755
323f921d10fSJason Evans--- a/include/jemalloc/jemalloc_rename.sh
324f921d10fSJason Evans+++ b/include/jemalloc/jemalloc_rename.sh
325f921d10fSJason Evans@@ -19,4 +19,6 @@ done
326f921d10fSJason Evans
327f921d10fSJason Evans cat <<EOF
328f921d10fSJason Evans #endif
329f8ca2db1SJason Evans+
330f921d10fSJason Evans+#include "jemalloc_FreeBSD.h"
331f921d10fSJason Evans EOF
332a4bd5210SJason Evansdiff --git a/src/jemalloc.c b/src/jemalloc.c
333*b7eaed25SJason Evansindex 52c86aa6..868c9e86 100644
334a4bd5210SJason Evans--- a/src/jemalloc.c
335a4bd5210SJason Evans+++ b/src/jemalloc.c
336*b7eaed25SJason Evans@@ -20,6 +20,10 @@
337d0e79aa3SJason Evans /******************************************************************************/
338d0e79aa3SJason Evans /* Data. */
339a4bd5210SJason Evans
340e722f8f8SJason Evans+/* Work around <http://llvm.org/bugs/show_bug.cgi?id=12623>: */
341e722f8f8SJason Evans+const char	*__malloc_options_1_0 = NULL;
342a4bd5210SJason Evans+__sym_compat(_malloc_options, __malloc_options_1_0, FBSD_1.0);
343a4bd5210SJason Evans+
344a4bd5210SJason Evans /* Runtime configuration options. */
345bde95144SJason Evans const char	*je_malloc_conf
346bde95144SJason Evans #ifndef _WIN32
347*b7eaed25SJason Evans@@ -2981,6 +2985,103 @@ je_malloc_usable_size(JEMALLOC_USABLE_SIZE_CONST void *ptr) {
348d0e79aa3SJason Evans  */
349d0e79aa3SJason Evans /******************************************************************************/
350a4bd5210SJason Evans /*
351d0e79aa3SJason Evans+ * Begin compatibility functions.
352d0e79aa3SJason Evans+ */
353d0e79aa3SJason Evans+
354d0e79aa3SJason Evans+#define	ALLOCM_LG_ALIGN(la)	(la)
355d0e79aa3SJason Evans+#define	ALLOCM_ALIGN(a)		(ffsl(a)-1)
356d0e79aa3SJason Evans+#define	ALLOCM_ZERO		((int)0x40)
357d0e79aa3SJason Evans+#define	ALLOCM_NO_MOVE		((int)0x80)
358d0e79aa3SJason Evans+
359d0e79aa3SJason Evans+#define	ALLOCM_SUCCESS		0
360d0e79aa3SJason Evans+#define	ALLOCM_ERR_OOM		1
361d0e79aa3SJason Evans+#define	ALLOCM_ERR_NOT_MOVED	2
362d0e79aa3SJason Evans+
363d0e79aa3SJason Evans+int
364*b7eaed25SJason Evans+je_allocm(void **ptr, size_t *rsize, size_t size, int flags) {
365d0e79aa3SJason Evans+	assert(ptr != NULL);
366d0e79aa3SJason Evans+
367*b7eaed25SJason Evans+	void *p = je_mallocx(size, flags);
368*b7eaed25SJason Evans+	if (p == NULL) {
369d0e79aa3SJason Evans+		return (ALLOCM_ERR_OOM);
370*b7eaed25SJason Evans+	}
371*b7eaed25SJason Evans+	if (rsize != NULL) {
372*b7eaed25SJason Evans+		*rsize = isalloc(tsdn_fetch(), p);
373*b7eaed25SJason Evans+	}
374d0e79aa3SJason Evans+	*ptr = p;
375*b7eaed25SJason Evans+	return ALLOCM_SUCCESS;
376d0e79aa3SJason Evans+}
377d0e79aa3SJason Evans+
378d0e79aa3SJason Evans+int
379*b7eaed25SJason Evans+je_rallocm(void **ptr, size_t *rsize, size_t size, size_t extra, int flags) {
380d0e79aa3SJason Evans+	assert(ptr != NULL);
381d0e79aa3SJason Evans+	assert(*ptr != NULL);
382d0e79aa3SJason Evans+	assert(size != 0);
383d0e79aa3SJason Evans+	assert(SIZE_T_MAX - size >= extra);
384d0e79aa3SJason Evans+
385*b7eaed25SJason Evans+	int ret;
386*b7eaed25SJason Evans+	bool no_move = flags & ALLOCM_NO_MOVE;
387*b7eaed25SJason Evans+
388d0e79aa3SJason Evans+	if (no_move) {
389d0e79aa3SJason Evans+		size_t usize = je_xallocx(*ptr, size, extra, flags);
390d0e79aa3SJason Evans+		ret = (usize >= size) ? ALLOCM_SUCCESS : ALLOCM_ERR_NOT_MOVED;
391*b7eaed25SJason Evans+		if (rsize != NULL) {
392d0e79aa3SJason Evans+			*rsize = usize;
393*b7eaed25SJason Evans+		}
394d0e79aa3SJason Evans+	} else {
395d0e79aa3SJason Evans+		void *p = je_rallocx(*ptr, size+extra, flags);
396d0e79aa3SJason Evans+		if (p != NULL) {
397d0e79aa3SJason Evans+			*ptr = p;
398d0e79aa3SJason Evans+			ret = ALLOCM_SUCCESS;
399*b7eaed25SJason Evans+		} else {
400d0e79aa3SJason Evans+			ret = ALLOCM_ERR_OOM;
401d0e79aa3SJason Evans+		}
402*b7eaed25SJason Evans+		if (rsize != NULL) {
403*b7eaed25SJason Evans+			*rsize = isalloc(tsdn_fetch(), *ptr);
404*b7eaed25SJason Evans+		}
405*b7eaed25SJason Evans+	}
406*b7eaed25SJason Evans+	return ret;
407d0e79aa3SJason Evans+}
408d0e79aa3SJason Evans+
409d0e79aa3SJason Evans+int
410*b7eaed25SJason Evans+je_sallocm(const void *ptr, size_t *rsize, int flags) {
411d0e79aa3SJason Evans+	assert(rsize != NULL);
412d0e79aa3SJason Evans+	*rsize = je_sallocx(ptr, flags);
413*b7eaed25SJason Evans+	return ALLOCM_SUCCESS;
414d0e79aa3SJason Evans+}
415d0e79aa3SJason Evans+
416d0e79aa3SJason Evans+int
417*b7eaed25SJason Evans+je_dallocm(void *ptr, int flags) {
418d0e79aa3SJason Evans+	je_dallocx(ptr, flags);
419*b7eaed25SJason Evans+	return ALLOCM_SUCCESS;
420d0e79aa3SJason Evans+}
421d0e79aa3SJason Evans+
422d0e79aa3SJason Evans+int
423*b7eaed25SJason Evans+je_nallocm(size_t *rsize, size_t size, int flags) {
424*b7eaed25SJason Evans+	size_t usize = je_nallocx(size, flags);
425*b7eaed25SJason Evans+	if (usize == 0) {
426*b7eaed25SJason Evans+		return ALLOCM_ERR_OOM;
427*b7eaed25SJason Evans+	}
428*b7eaed25SJason Evans+	if (rsize != NULL) {
429d0e79aa3SJason Evans+		*rsize = usize;
430*b7eaed25SJason Evans+	}
431*b7eaed25SJason Evans+	return ALLOCM_SUCCESS;
432d0e79aa3SJason Evans+}
433d0e79aa3SJason Evans+
434d0e79aa3SJason Evans+#undef ALLOCM_LG_ALIGN
435d0e79aa3SJason Evans+#undef ALLOCM_ALIGN
436d0e79aa3SJason Evans+#undef ALLOCM_ZERO
437d0e79aa3SJason Evans+#undef ALLOCM_NO_MOVE
438d0e79aa3SJason Evans+
439d0e79aa3SJason Evans+#undef ALLOCM_SUCCESS
440d0e79aa3SJason Evans+#undef ALLOCM_ERR_OOM
441d0e79aa3SJason Evans+#undef ALLOCM_ERR_NOT_MOVED
442d0e79aa3SJason Evans+
443d0e79aa3SJason Evans+/*
444d0e79aa3SJason Evans+ * End compatibility functions.
445d0e79aa3SJason Evans+ */
446d0e79aa3SJason Evans+/******************************************************************************/
447d0e79aa3SJason Evans+/*
448d0e79aa3SJason Evans  * The following functions are used by threading libraries for protection of
449d0e79aa3SJason Evans  * malloc during fork().
450d0e79aa3SJason Evans  */
451*b7eaed25SJason Evans@@ -3141,4 +3242,11 @@ jemalloc_postfork_child(void) {
4521f0a49e8SJason Evans 	ctl_postfork_child(tsd_tsdn(tsd));
453d0e79aa3SJason Evans }
454d0e79aa3SJason Evans
455d0e79aa3SJason Evans+void
456d0e79aa3SJason Evans+_malloc_first_thread(void)
457d0e79aa3SJason Evans+{
458d0e79aa3SJason Evans+
459d0e79aa3SJason Evans+	(void)malloc_mutex_first_thread();
460d0e79aa3SJason Evans+}
461d0e79aa3SJason Evans+
462d0e79aa3SJason Evans /******************************************************************************/
463*b7eaed25SJason Evansdiff --git a/src/malloc_io.c b/src/malloc_io.c
464*b7eaed25SJason Evansindex 6b99afcd..4363cb83 100644
465*b7eaed25SJason Evans--- a/src/malloc_io.c
466*b7eaed25SJason Evans+++ b/src/malloc_io.c
467*b7eaed25SJason Evans@@ -88,6 +88,20 @@ wrtmessage(void *cbopaque, const char *s) {
468*b7eaed25SJason Evans
469*b7eaed25SJason Evans JEMALLOC_EXPORT void	(*je_malloc_message)(void *, const char *s);
470*b7eaed25SJason Evans
471*b7eaed25SJason Evans+JEMALLOC_ATTR(visibility("hidden"))
472*b7eaed25SJason Evans+void
473*b7eaed25SJason Evans+wrtmessage_1_0(const char *s1, const char *s2, const char *s3, const char *s4) {
474*b7eaed25SJason Evans+
475*b7eaed25SJason Evans+	wrtmessage(NULL, s1);
476*b7eaed25SJason Evans+	wrtmessage(NULL, s2);
477*b7eaed25SJason Evans+	wrtmessage(NULL, s3);
478*b7eaed25SJason Evans+	wrtmessage(NULL, s4);
479*b7eaed25SJason Evans+}
480*b7eaed25SJason Evans+
481*b7eaed25SJason Evans+void	(*__malloc_message_1_0)(const char *s1, const char *s2, const char *s3,
482*b7eaed25SJason Evans+    const char *s4) = wrtmessage_1_0;
483*b7eaed25SJason Evans+__sym_compat(_malloc_message, __malloc_message_1_0, FBSD_1.0);
484*b7eaed25SJason Evans+
485*b7eaed25SJason Evans /*
486*b7eaed25SJason Evans  * Wrapper around malloc_message() that avoids the need for
487*b7eaed25SJason Evans  * je_malloc_message(...) throughout the code.
488a4bd5210SJason Evansdiff --git a/src/mutex.c b/src/mutex.c
489*b7eaed25SJason Evansindex a528ef0c..820af613 100644
490a4bd5210SJason Evans--- a/src/mutex.c
491a4bd5210SJason Evans+++ b/src/mutex.c
492*b7eaed25SJason Evans@@ -40,6 +40,17 @@ pthread_create(pthread_t *__restrict thread,
493a4bd5210SJason Evans #ifdef JEMALLOC_MUTEX_INIT_CB
49482872ac0SJason Evans JEMALLOC_EXPORT int	_pthread_mutex_init_calloc_cb(pthread_mutex_t *mutex,
495a4bd5210SJason Evans     void *(calloc_cb)(size_t, size_t));
496a4bd5210SJason Evans+
497d0e79aa3SJason Evans+#pragma weak _pthread_mutex_init_calloc_cb
498a4bd5210SJason Evans+int
499d0e79aa3SJason Evans+_pthread_mutex_init_calloc_cb(pthread_mutex_t *mutex,
500a4bd5210SJason Evans+    void *(calloc_cb)(size_t, size_t))
501a4bd5210SJason Evans+{
502a4bd5210SJason Evans+
503d0e79aa3SJason Evans+	return (((int (*)(pthread_mutex_t *, void *(*)(size_t, size_t)))
504d0e79aa3SJason Evans+	    __libc_interposing[INTERPOS__pthread_mutex_init_calloc_cb])(mutex,
505d0e79aa3SJason Evans+	    calloc_cb));
506a4bd5210SJason Evans+}
507a4bd5210SJason Evans #endif
508a4bd5210SJason Evans
509*b7eaed25SJason Evans void
510*b7eaed25SJason Evans@@ -130,6 +141,16 @@ mutex_addr_comp(const witness_t *witness1, void *mutex1,
511d0e79aa3SJason Evans }
512d0e79aa3SJason Evans
513d0e79aa3SJason Evans bool
514*b7eaed25SJason Evans+malloc_mutex_first_thread(void) {
515d0e79aa3SJason Evans+
516d0e79aa3SJason Evans+#ifndef JEMALLOC_MUTEX_INIT_CB
517d0e79aa3SJason Evans+	return (malloc_mutex_first_thread());
518d0e79aa3SJason Evans+#else
519d0e79aa3SJason Evans+	return (false);
520d0e79aa3SJason Evans+#endif
521d0e79aa3SJason Evans+}
522a4bd5210SJason Evans+
523*b7eaed25SJason Evans+bool
524*b7eaed25SJason Evans malloc_mutex_init(malloc_mutex_t *mutex, const char *name,
525*b7eaed25SJason Evans     witness_rank_t rank, malloc_mutex_lock_order_t lock_order) {
526*b7eaed25SJason Evans 	mutex_prof_data_init(&mutex->prof_data);
527