xref: /freebsd/contrib/jemalloc/FREEBSD-diffs (revision 7d4374f65f7b3df3d2567029c510f2e1576f0f69)
1a4bd5210SJason Evansdiff --git a/doc/jemalloc.xml.in b/doc/jemalloc.xml.in
2c5ad8142SEric van Gyzenindex 7fecda7c..d5ca5e86 100644
3a4bd5210SJason Evans--- a/doc/jemalloc.xml.in
4a4bd5210SJason Evans+++ b/doc/jemalloc.xml.in
51a78ec89SJason Evans@@ -53,11 +53,22 @@
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>,
12b7eaed25SJason Evans+    <option>--enable-lazy-lock</option>, <option>--enable-stats</option>,
131a78ec89SJason Evans+    <option>--enable-utrace</option>, <option>--enable-xmalloc</option>, and
141a78ec89SJason Evans+    <option>--with-malloc-conf=abort_conf:false</option>.
15b7eaed25SJason Evans+    Additionally, <option>--enable-debug</option> is enabled in development
16b7eaed25SJason Evans+    versions of FreeBSD (controlled by the
17*7d4374f6SDimitry Andric+    <constant>MK_MALLOC_PRODUCTION</constant> make variable).</para>
18d0e79aa3SJason Evans+
19a4bd5210SJason Evans   </refsect1>
20a4bd5210SJason Evans   <refsynopsisdiv>
21a4bd5210SJason Evans     <title>SYNOPSIS</title>
22c13244b9SJason Evans     <funcsynopsis>
23c13244b9SJason Evans-      <funcsynopsisinfo>#include &lt;<filename class="headerfile">jemalloc/jemalloc.h</filename>&gt;</funcsynopsisinfo>
24c13244b9SJason Evans+      <funcsynopsisinfo>#include &lt;<filename class="headerfile">stdlib.h</filename>&gt;
25c13244b9SJason Evans+#include &lt;<filename class="headerfile">malloc_np.h</filename>&gt;</funcsynopsisinfo>
26c13244b9SJason Evans       <refsect2>
27c13244b9SJason Evans         <title>Standard API</title>
28c13244b9SJason Evans         <funcprototype>
29c5ad8142SEric van Gyzen@@ -3510,4 +3521,18 @@ malloc_conf = "narenas:1";]]></programlisting></para>
30bde95144SJason Evans     <para>The <function>posix_memalign()</function> function conforms
31bde95144SJason Evans     to IEEE Std 1003.1-2001 (<quote>POSIX.1</quote>).</para>
32a4bd5210SJason Evans   </refsect1>
33a4bd5210SJason Evans+  <refsect1 id="history">
34a4bd5210SJason Evans+    <title>HISTORY</title>
35bde95144SJason Evans+    <para>The <function>malloc_usable_size()</function> and
36bde95144SJason Evans+    <function>posix_memalign()</function> functions first appeared in FreeBSD
37bde95144SJason Evans+    7.0.</para>
38a4bd5210SJason Evans+
39bde95144SJason Evans+    <para>The <function>aligned_alloc()</function>,
40bde95144SJason Evans+    <function>malloc_stats_print()</function>, and
41bde95144SJason Evans+    <function>mallctl*()</function> functions first appeared in FreeBSD
42bde95144SJason Evans+    10.0.</para>
43f921d10fSJason Evans+
44bde95144SJason Evans+    <para>The <function>*allocx()</function> functions first appeared in FreeBSD
45bde95144SJason Evans+    11.0.</para>
46a4bd5210SJason Evans+  </refsect1>
47a4bd5210SJason Evans </refentry>
48b7eaed25SJason Evansdiff --git a/include/jemalloc/internal/jemalloc_internal_decls.h b/include/jemalloc/internal/jemalloc_internal_decls.h
49c5ad8142SEric van Gyzenindex 7d6053e2..a0e4f5af 100644
50b7eaed25SJason Evans--- a/include/jemalloc/internal/jemalloc_internal_decls.h
51b7eaed25SJason Evans+++ b/include/jemalloc/internal/jemalloc_internal_decls.h
52b7eaed25SJason Evans@@ -1,6 +1,9 @@
53b7eaed25SJason Evans #ifndef JEMALLOC_INTERNAL_DECLS_H
54b7eaed25SJason Evans #define JEMALLOC_INTERNAL_DECLS_H
55fbb1d85eSJason Evans
56b7eaed25SJason Evans+#include "libc_private.h"
57b7eaed25SJason Evans+#include "namespace.h"
58b7eaed25SJason Evans+
59b7eaed25SJason Evans #include <math.h>
60b7eaed25SJason Evans #ifdef _WIN32
61b7eaed25SJason Evans #  include <windows.h>
62c5ad8142SEric van Gyzendiff --git a/include/jemalloc/internal/jemalloc_internal_defs_FreeBSD.h b/include/jemalloc/internal/jemalloc_internal_defs_FreeBSD.h
63c5ad8142SEric van Gyzennew file mode 100644
64c5ad8142SEric van Gyzenindex 00000000..0dab1296
65c5ad8142SEric van Gyzen--- /dev/null
66c5ad8142SEric van Gyzen+++ b/include/jemalloc/internal/jemalloc_internal_defs_FreeBSD.h
67c5ad8142SEric van Gyzen@@ -0,0 +1,9 @@
68c5ad8142SEric van Gyzen+#ifndef __clang__
69c5ad8142SEric van Gyzen+#  undef JEMALLOC_INTERNAL_UNREACHABLE
70c5ad8142SEric van Gyzen+#  define JEMALLOC_INTERNAL_UNREACHABLE abort
71c5ad8142SEric van Gyzen+
72c5ad8142SEric van Gyzen+#  undef JEMALLOC_C11_ATOMICS
73c5ad8142SEric van Gyzen+#  undef JEMALLOC_GCC_ATOMIC_ATOMICS
74c5ad8142SEric van Gyzen+#  undef JEMALLOC_GCC_U8_ATOMIC_ATOMICS
75c5ad8142SEric van Gyzen+#  undef JEMALLOC_GCC_U8_SYNC_ATOMICS
76c5ad8142SEric van Gyzen+#endif
77b7eaed25SJason Evansdiff --git a/include/jemalloc/internal/jemalloc_preamble.h.in b/include/jemalloc/internal/jemalloc_preamble.h.in
78c5ad8142SEric van Gyzenindex 3418cbfa..53e30dc4 100644
79b7eaed25SJason Evans--- a/include/jemalloc/internal/jemalloc_preamble.h.in
80b7eaed25SJason Evans+++ b/include/jemalloc/internal/jemalloc_preamble.h.in
81d0e79aa3SJason Evans@@ -8,6 +8,9 @@
82d0e79aa3SJason Evans #include <sys/ktrace.h>
83e722f8f8SJason Evans #endif
84a4bd5210SJason Evans
85a4bd5210SJason Evans+#include "un-namespace.h"
86a4bd5210SJason Evans+#include "libc_private.h"
87a4bd5210SJason Evans+
88a4bd5210SJason Evans #define JEMALLOC_NO_DEMANGLE
89f921d10fSJason Evans #ifdef JEMALLOC_JET
90b7eaed25SJason Evans #  undef JEMALLOC_IS_MALLOC
910ef50b4eSJason Evans@@ -79,13 +82,7 @@ static const bool config_fill =
92edaa25bdSJason Evans     false
93edaa25bdSJason Evans #endif
94edaa25bdSJason Evans     ;
95edaa25bdSJason Evans-static const bool config_lazy_lock =
96edaa25bdSJason Evans-#ifdef JEMALLOC_LAZY_LOCK
97edaa25bdSJason Evans-    true
98edaa25bdSJason Evans-#else
99edaa25bdSJason Evans-    false
100edaa25bdSJason Evans-#endif
101edaa25bdSJason Evans-    ;
102edaa25bdSJason Evans+static const bool config_lazy_lock = true;
103df0d881dSJason Evans static const char * const config_malloc_conf = JEMALLOC_CONFIG_MALLOC_CONF;
104edaa25bdSJason Evans static const bool config_prof =
105edaa25bdSJason Evans #ifdef JEMALLOC_PROF
106a4bd5210SJason Evansdiff --git a/include/jemalloc/internal/mutex.h b/include/jemalloc/internal/mutex.h
107c5ad8142SEric van Gyzenindex 7c24f072..94af1618 100644
108a4bd5210SJason Evans--- a/include/jemalloc/internal/mutex.h
109a4bd5210SJason Evans+++ b/include/jemalloc/internal/mutex.h
110c5ad8142SEric van Gyzen@@ -135,9 +135,6 @@ struct malloc_mutex_s {
111a4bd5210SJason Evans
112a4bd5210SJason Evans #ifdef JEMALLOC_LAZY_LOCK
113a4bd5210SJason Evans extern bool isthreaded;
114a4bd5210SJason Evans-#else
1158ed34ab0SJason Evans-#  undef isthreaded /* Undo private_namespace.h definition. */
116a4bd5210SJason Evans-#  define isthreaded true
117a4bd5210SJason Evans #endif
118a4bd5210SJason Evans
1191f0a49e8SJason Evans bool malloc_mutex_init(malloc_mutex_t *mutex, const char *name,
120c5ad8142SEric van Gyzen@@ -145,6 +142,7 @@ bool malloc_mutex_init(malloc_mutex_t *mutex, const char *name,
1211f0a49e8SJason Evans void malloc_mutex_prefork(tsdn_t *tsdn, malloc_mutex_t *mutex);
1221f0a49e8SJason Evans void malloc_mutex_postfork_parent(tsdn_t *tsdn, malloc_mutex_t *mutex);
1231f0a49e8SJason Evans void malloc_mutex_postfork_child(tsdn_t *tsdn, malloc_mutex_t *mutex);
124d0e79aa3SJason Evans+bool malloc_mutex_first_thread(void);
1251f0a49e8SJason Evans bool malloc_mutex_boot(void);
126b7eaed25SJason Evans void malloc_mutex_prof_data_reset(tsdn_t *tsdn, malloc_mutex_t *mutex);
127d0e79aa3SJason Evans
128c5ad8142SEric van Gyzendiff --git a/include/jemalloc/internal/test_hooks.h b/include/jemalloc/internal/test_hooks.h
129c5ad8142SEric van Gyzenindex a6351e59..0780c52f 100644
130c5ad8142SEric van Gyzen--- a/include/jemalloc/internal/test_hooks.h
131c5ad8142SEric van Gyzen+++ b/include/jemalloc/internal/test_hooks.h
132c5ad8142SEric van Gyzen@@ -6,13 +6,6 @@ extern JEMALLOC_EXPORT void (*test_hooks_libc_hook)();
133c5ad8142SEric van Gyzen
134c5ad8142SEric van Gyzen #define JEMALLOC_HOOK(fn, hook) ((void)(hook != NULL && (hook(), 0)), fn)
135c5ad8142SEric van Gyzen
136c5ad8142SEric van Gyzen-#define open JEMALLOC_HOOK(open, test_hooks_libc_hook)
137c5ad8142SEric van Gyzen-#define read JEMALLOC_HOOK(read, test_hooks_libc_hook)
138c5ad8142SEric van Gyzen-#define write JEMALLOC_HOOK(write, test_hooks_libc_hook)
139c5ad8142SEric van Gyzen-#define readlink JEMALLOC_HOOK(readlink, test_hooks_libc_hook)
140c5ad8142SEric van Gyzen-#define close JEMALLOC_HOOK(close, test_hooks_libc_hook)
141c5ad8142SEric van Gyzen-#define creat JEMALLOC_HOOK(creat, test_hooks_libc_hook)
142c5ad8142SEric van Gyzen-#define secure_getenv JEMALLOC_HOOK(secure_getenv, test_hooks_libc_hook)
143c5ad8142SEric van Gyzen /* Note that this is undef'd and re-define'd in src/prof.c. */
144c5ad8142SEric van Gyzen #define _Unwind_Backtrace JEMALLOC_HOOK(_Unwind_Backtrace, test_hooks_libc_hook)
145c5ad8142SEric van Gyzen
1460ef50b4eSJason Evansdiff --git a/include/jemalloc/internal/tsd.h b/include/jemalloc/internal/tsd.h
147c5ad8142SEric van Gyzenindex 9ba26004..ecfda5d6 100644
1480ef50b4eSJason Evans--- a/include/jemalloc/internal/tsd.h
1490ef50b4eSJason Evans+++ b/include/jemalloc/internal/tsd.h
150c5ad8142SEric van Gyzen@@ -198,7 +198,8 @@ struct tsd_s {
151c5ad8142SEric van Gyzen 	t TSD_MANGLE(n);
1520ef50b4eSJason Evans MALLOC_TSD
1530ef50b4eSJason Evans #undef O
1540ef50b4eSJason Evans-};
1550ef50b4eSJason Evans+/* AddressSanitizer requires TLS data to be aligned to at least 8 bytes. */
1560ef50b4eSJason Evans+} JEMALLOC_ALIGNED(16);
1570ef50b4eSJason Evans
158c5ad8142SEric van Gyzen JEMALLOC_ALWAYS_INLINE uint8_t
159c5ad8142SEric van Gyzen tsd_state_get(tsd_t *tsd) {
160a4bd5210SJason Evansdiff --git a/include/jemalloc/jemalloc_FreeBSD.h b/include/jemalloc/jemalloc_FreeBSD.h
161a4bd5210SJason Evansnew file mode 100644
1620ef50b4eSJason Evansindex 00000000..b752b0e7
163a4bd5210SJason Evans--- /dev/null
164a4bd5210SJason Evans+++ b/include/jemalloc/jemalloc_FreeBSD.h
165b7eaed25SJason Evans@@ -0,0 +1,185 @@
166a4bd5210SJason Evans+/*
167a4bd5210SJason Evans+ * Override settings that were generated in jemalloc_defs.h as necessary.
168a4bd5210SJason Evans+ */
169a4bd5210SJason Evans+
170a4bd5210SJason Evans+#undef JEMALLOC_OVERRIDE_VALLOC
171a4bd5210SJason Evans+
172a4bd5210SJason Evans+#ifndef MALLOC_PRODUCTION
173a4bd5210SJason Evans+#define	JEMALLOC_DEBUG
174a4bd5210SJason Evans+#endif
175a4bd5210SJason Evans+
1761f0a49e8SJason Evans+#undef JEMALLOC_DSS
1771f0a49e8SJason Evans+
178b7eaed25SJason Evans+#undef JEMALLOC_BACKGROUND_THREAD
179b7eaed25SJason Evans+
180a4bd5210SJason Evans+/*
181a4bd5210SJason Evans+ * The following are architecture-dependent, so conditionally define them for
182a4bd5210SJason Evans+ * each supported architecture.
183a4bd5210SJason Evans+ */
184a4bd5210SJason Evans+#undef JEMALLOC_TLS_MODEL
185c2a2eeffSMarius Strobl+#undef LG_PAGE
186b7eaed25SJason Evans+#undef LG_VADDR
187a4bd5210SJason Evans+#undef LG_SIZEOF_PTR
188a4bd5210SJason Evans+#undef LG_SIZEOF_INT
189a4bd5210SJason Evans+#undef LG_SIZEOF_LONG
190a4bd5210SJason Evans+#undef LG_SIZEOF_INTMAX_T
191a4bd5210SJason Evans+
192a4bd5210SJason Evans+#ifdef __i386__
193b7eaed25SJason Evans+#  define LG_VADDR		32
194a4bd5210SJason Evans+#  define LG_SIZEOF_PTR		2
195a4bd5210SJason Evans+#  define JEMALLOC_TLS_MODEL	__attribute__((tls_model("initial-exec")))
196a4bd5210SJason Evans+#endif
197a4bd5210SJason Evans+#ifdef __ia64__
198b7eaed25SJason Evans+#  define LG_VADDR		64
199a4bd5210SJason Evans+#  define LG_SIZEOF_PTR		3
200a4bd5210SJason Evans+#endif
201a4bd5210SJason Evans+#ifdef __sparc64__
202b7eaed25SJason Evans+#  define LG_VADDR		64
203a4bd5210SJason Evans+#  define LG_SIZEOF_PTR		3
204a4bd5210SJason Evans+#  define JEMALLOC_TLS_MODEL	__attribute__((tls_model("initial-exec")))
205a4bd5210SJason Evans+#endif
206a4bd5210SJason Evans+#ifdef __amd64__
207b7eaed25SJason Evans+#  define LG_VADDR		48
208a4bd5210SJason Evans+#  define LG_SIZEOF_PTR		3
209a4bd5210SJason Evans+#  define JEMALLOC_TLS_MODEL	__attribute__((tls_model("initial-exec")))
210a4bd5210SJason Evans+#endif
211a4bd5210SJason Evans+#ifdef __arm__
212b7eaed25SJason Evans+#  define LG_VADDR		32
213a4bd5210SJason Evans+#  define LG_SIZEOF_PTR		2
214a4bd5210SJason Evans+#endif
215d8e39d2dSJason Evans+#ifdef __aarch64__
216b7eaed25SJason Evans+#  define LG_VADDR		48
217d8e39d2dSJason Evans+#  define LG_SIZEOF_PTR		3
218d8e39d2dSJason Evans+#endif
219a4bd5210SJason Evans+#ifdef __mips__
220e722f8f8SJason Evans+#ifdef __mips_n64
221b7eaed25SJason Evans+#  define LG_VADDR		64
222e722f8f8SJason Evans+#  define LG_SIZEOF_PTR		3
223e722f8f8SJason Evans+#else
224b7eaed25SJason Evans+#  define LG_VADDR		32
225a4bd5210SJason Evans+#  define LG_SIZEOF_PTR		2
226a4bd5210SJason Evans+#endif
227e722f8f8SJason Evans+#endif
228a4bd5210SJason Evans+#ifdef __powerpc64__
229b7eaed25SJason Evans+#  define LG_VADDR		64
230a4bd5210SJason Evans+#  define LG_SIZEOF_PTR		3
231a4bd5210SJason Evans+#elif defined(__powerpc__)
232b7eaed25SJason Evans+#  define LG_VADDR		32
233a4bd5210SJason Evans+#  define LG_SIZEOF_PTR		2
234a4bd5210SJason Evans+#endif
2350ef50b4eSJason Evans+#ifdef __riscv
236ea69bf7fSBrooks Davis+#  define LG_VADDR		48
237df0d881dSJason Evans+#  define LG_SIZEOF_PTR		3
238df0d881dSJason Evans+#endif
239a4bd5210SJason Evans+
240a4bd5210SJason Evans+#ifndef JEMALLOC_TLS_MODEL
241a4bd5210SJason Evans+#  define JEMALLOC_TLS_MODEL	/* Default. */
242a4bd5210SJason Evans+#endif
243a4bd5210SJason Evans+
244c2a2eeffSMarius Strobl+#define	LG_PAGE			PAGE_SHIFT
245a4bd5210SJason Evans+#define	LG_SIZEOF_INT		2
246a4bd5210SJason Evans+#define	LG_SIZEOF_LONG		LG_SIZEOF_PTR
247a4bd5210SJason Evans+#define	LG_SIZEOF_INTMAX_T	3
248a4bd5210SJason Evans+
249337776f8SJason Evans+#undef CPU_SPINWAIT
250337776f8SJason Evans+#include <machine/cpu.h>
251337776f8SJason Evans+#include <machine/cpufunc.h>
252337776f8SJason Evans+#define	CPU_SPINWAIT		cpu_spinwait()
253337776f8SJason Evans+
254a4bd5210SJason Evans+/* Disable lazy-lock machinery, mangle isthreaded, and adjust its type. */
255a4bd5210SJason Evans+#undef JEMALLOC_LAZY_LOCK
256a4bd5210SJason Evans+extern int __isthreaded;
257a4bd5210SJason Evans+#define	isthreaded		((bool)__isthreaded)
258a4bd5210SJason Evans+
259a4bd5210SJason Evans+/* Mangle. */
260f8ca2db1SJason Evans+#undef je_malloc
261f8ca2db1SJason Evans+#undef je_calloc
262f8ca2db1SJason Evans+#undef je_posix_memalign
263d0e79aa3SJason Evans+#undef je_aligned_alloc
264df0d881dSJason Evans+#undef je_realloc
265df0d881dSJason Evans+#undef je_free
266f8ca2db1SJason Evans+#undef je_malloc_usable_size
267f921d10fSJason Evans+#undef je_mallocx
268f921d10fSJason Evans+#undef je_rallocx
269f921d10fSJason Evans+#undef je_xallocx
270f921d10fSJason Evans+#undef je_sallocx
271f921d10fSJason Evans+#undef je_dallocx
272df0d881dSJason Evans+#undef je_sdallocx
273f921d10fSJason Evans+#undef je_nallocx
274df0d881dSJason Evans+#undef je_mallctl
275df0d881dSJason Evans+#undef je_mallctlnametomib
276df0d881dSJason Evans+#undef je_mallctlbymib
277df0d881dSJason Evans+#undef je_malloc_stats_print
278f8ca2db1SJason Evans+#undef je_allocm
279f8ca2db1SJason Evans+#undef je_rallocm
280f8ca2db1SJason Evans+#undef je_sallocm
281f8ca2db1SJason Evans+#undef je_dallocm
282f8ca2db1SJason Evans+#undef je_nallocm
283f8ca2db1SJason Evans+#define	je_malloc		__malloc
284f8ca2db1SJason Evans+#define	je_calloc		__calloc
285f8ca2db1SJason Evans+#define	je_posix_memalign	__posix_memalign
286d0e79aa3SJason Evans+#define	je_aligned_alloc	__aligned_alloc
287df0d881dSJason Evans+#define	je_realloc		__realloc
288df0d881dSJason Evans+#define	je_free			__free
289f8ca2db1SJason Evans+#define	je_malloc_usable_size	__malloc_usable_size
290f921d10fSJason Evans+#define	je_mallocx		__mallocx
291f921d10fSJason Evans+#define	je_rallocx		__rallocx
292f921d10fSJason Evans+#define	je_xallocx		__xallocx
293f921d10fSJason Evans+#define	je_sallocx		__sallocx
294f921d10fSJason Evans+#define	je_dallocx		__dallocx
295df0d881dSJason Evans+#define	je_sdallocx		__sdallocx
296f921d10fSJason Evans+#define	je_nallocx		__nallocx
297df0d881dSJason Evans+#define	je_mallctl		__mallctl
298df0d881dSJason Evans+#define	je_mallctlnametomib	__mallctlnametomib
299df0d881dSJason Evans+#define	je_mallctlbymib		__mallctlbymib
300df0d881dSJason Evans+#define	je_malloc_stats_print	__malloc_stats_print
301f8ca2db1SJason Evans+#define	je_allocm		__allocm
302f8ca2db1SJason Evans+#define	je_rallocm		__rallocm
303f8ca2db1SJason Evans+#define	je_sallocm		__sallocm
304f8ca2db1SJason Evans+#define	je_dallocm		__dallocm
305f8ca2db1SJason Evans+#define	je_nallocm		__nallocm
306a4bd5210SJason Evans+#define	open			_open
307a4bd5210SJason Evans+#define	read			_read
308a4bd5210SJason Evans+#define	write			_write
309a4bd5210SJason Evans+#define	close			_close
310b7eaed25SJason Evans+#define	pthread_join		_pthread_join
311b7eaed25SJason Evans+#define	pthread_once		_pthread_once
312b7eaed25SJason Evans+#define	pthread_self		_pthread_self
313b7eaed25SJason Evans+#define	pthread_equal		_pthread_equal
314a4bd5210SJason Evans+#define	pthread_mutex_lock	_pthread_mutex_lock
315b7eaed25SJason Evans+#define	pthread_mutex_trylock	_pthread_mutex_trylock
316a4bd5210SJason Evans+#define	pthread_mutex_unlock	_pthread_mutex_unlock
317b7eaed25SJason Evans+#define	pthread_cond_init	_pthread_cond_init
318b7eaed25SJason Evans+#define	pthread_cond_wait	_pthread_cond_wait
319b7eaed25SJason Evans+#define	pthread_cond_timedwait	_pthread_cond_timedwait
320b7eaed25SJason Evans+#define	pthread_cond_signal	_pthread_cond_signal
321f8ca2db1SJason Evans+
322f8ca2db1SJason Evans+#ifdef JEMALLOC_C_
323f8ca2db1SJason Evans+/*
324f8ca2db1SJason Evans+ * Define 'weak' symbols so that an application can have its own versions
325f8ca2db1SJason Evans+ * of malloc, calloc, realloc, free, et al.
326f8ca2db1SJason Evans+ */
327f8ca2db1SJason Evans+__weak_reference(__malloc, malloc);
328f8ca2db1SJason Evans+__weak_reference(__calloc, calloc);
329f8ca2db1SJason Evans+__weak_reference(__posix_memalign, posix_memalign);
330d0e79aa3SJason Evans+__weak_reference(__aligned_alloc, aligned_alloc);
331df0d881dSJason Evans+__weak_reference(__realloc, realloc);
332df0d881dSJason Evans+__weak_reference(__free, free);
333f8ca2db1SJason Evans+__weak_reference(__malloc_usable_size, malloc_usable_size);
334f921d10fSJason Evans+__weak_reference(__mallocx, mallocx);
335f921d10fSJason Evans+__weak_reference(__rallocx, rallocx);
336f921d10fSJason Evans+__weak_reference(__xallocx, xallocx);
337f921d10fSJason Evans+__weak_reference(__sallocx, sallocx);
338f921d10fSJason Evans+__weak_reference(__dallocx, dallocx);
339df0d881dSJason Evans+__weak_reference(__sdallocx, sdallocx);
340f921d10fSJason Evans+__weak_reference(__nallocx, nallocx);
341df0d881dSJason Evans+__weak_reference(__mallctl, mallctl);
342df0d881dSJason Evans+__weak_reference(__mallctlnametomib, mallctlnametomib);
343df0d881dSJason Evans+__weak_reference(__mallctlbymib, mallctlbymib);
344df0d881dSJason Evans+__weak_reference(__malloc_stats_print, malloc_stats_print);
345f8ca2db1SJason Evans+__weak_reference(__allocm, allocm);
346f8ca2db1SJason Evans+__weak_reference(__rallocm, rallocm);
347f8ca2db1SJason Evans+__weak_reference(__sallocm, sallocm);
348f8ca2db1SJason Evans+__weak_reference(__dallocm, dallocm);
349f8ca2db1SJason Evans+__weak_reference(__nallocm, nallocm);
350f8ca2db1SJason Evans+#endif
351f921d10fSJason Evansdiff --git a/include/jemalloc/jemalloc_rename.sh b/include/jemalloc/jemalloc_rename.sh
352b7eaed25SJason Evansindex f9438912..47d032c1 100755
353f921d10fSJason Evans--- a/include/jemalloc/jemalloc_rename.sh
354f921d10fSJason Evans+++ b/include/jemalloc/jemalloc_rename.sh
355f921d10fSJason Evans@@ -19,4 +19,6 @@ done
356f921d10fSJason Evans
357f921d10fSJason Evans cat <<EOF
358f921d10fSJason Evans #endif
359f8ca2db1SJason Evans+
360f921d10fSJason Evans+#include "jemalloc_FreeBSD.h"
361f921d10fSJason Evans EOF
362a4bd5210SJason Evansdiff --git a/src/jemalloc.c b/src/jemalloc.c
363c5ad8142SEric van Gyzenindex ed13718d..fefb719a 100644
364a4bd5210SJason Evans--- a/src/jemalloc.c
365a4bd5210SJason Evans+++ b/src/jemalloc.c
366c5ad8142SEric van Gyzen@@ -23,6 +23,10 @@
367d0e79aa3SJason Evans /******************************************************************************/
368d0e79aa3SJason Evans /* Data. */
369a4bd5210SJason Evans
370e722f8f8SJason Evans+/* Work around <http://llvm.org/bugs/show_bug.cgi?id=12623>: */
371e722f8f8SJason Evans+const char	*__malloc_options_1_0 = NULL;
372a4bd5210SJason Evans+__sym_compat(_malloc_options, __malloc_options_1_0, FBSD_1.0);
373a4bd5210SJason Evans+
374a4bd5210SJason Evans /* Runtime configuration options. */
375bde95144SJason Evans const char	*je_malloc_conf
376bde95144SJason Evans #ifndef _WIN32
377c5ad8142SEric van Gyzen@@ -2660,25 +2664,6 @@ je_realloc(void *ptr, size_t arg_size) {
378c5ad8142SEric van Gyzen 	LOG("core.realloc.entry", "ptr: %p, size: %zu\n", ptr, size);
379c5ad8142SEric van Gyzen
380c5ad8142SEric van Gyzen 	if (unlikely(size == 0)) {
381c5ad8142SEric van Gyzen-		if (ptr != NULL) {
382c5ad8142SEric van Gyzen-			/* realloc(ptr, 0) is equivalent to free(ptr). */
383c5ad8142SEric van Gyzen-			UTRACE(ptr, 0, 0);
384c5ad8142SEric van Gyzen-			tcache_t *tcache;
385c5ad8142SEric van Gyzen-			tsd_t *tsd = tsd_fetch();
386c5ad8142SEric van Gyzen-			if (tsd_reentrancy_level_get(tsd) == 0) {
387c5ad8142SEric van Gyzen-				tcache = tcache_get(tsd);
388c5ad8142SEric van Gyzen-			} else {
389c5ad8142SEric van Gyzen-				tcache = NULL;
390c5ad8142SEric van Gyzen-			}
391c5ad8142SEric van Gyzen-
392c5ad8142SEric van Gyzen-			uintptr_t args[3] = {(uintptr_t)ptr, size};
393c5ad8142SEric van Gyzen-			hook_invoke_dalloc(hook_dalloc_realloc, ptr, args);
394c5ad8142SEric van Gyzen-
395c5ad8142SEric van Gyzen-			ifree(tsd, ptr, tcache, true);
396c5ad8142SEric van Gyzen-
397c5ad8142SEric van Gyzen-			LOG("core.realloc.exit", "result: %p", NULL);
398c5ad8142SEric van Gyzen-			return NULL;
399c5ad8142SEric van Gyzen-		}
400c5ad8142SEric van Gyzen 		size = 1;
401c5ad8142SEric van Gyzen 	}
402c5ad8142SEric van Gyzen
403c5ad8142SEric van Gyzen@@ -3750,6 +3735,103 @@ je_malloc_usable_size(JEMALLOC_USABLE_SIZE_CONST void *ptr) {
404c5ad8142SEric van Gyzen  * End non-standard functions.
405d0e79aa3SJason Evans  */
406d0e79aa3SJason Evans /******************************************************************************/
407c5ad8142SEric van Gyzen+/*
408d0e79aa3SJason Evans+ * Begin compatibility functions.
409d0e79aa3SJason Evans+ */
410d0e79aa3SJason Evans+
411d0e79aa3SJason Evans+#define	ALLOCM_LG_ALIGN(la)	(la)
412d0e79aa3SJason Evans+#define	ALLOCM_ALIGN(a)		(ffsl(a)-1)
413d0e79aa3SJason Evans+#define	ALLOCM_ZERO		((int)0x40)
414d0e79aa3SJason Evans+#define	ALLOCM_NO_MOVE		((int)0x80)
415d0e79aa3SJason Evans+
416d0e79aa3SJason Evans+#define	ALLOCM_SUCCESS		0
417d0e79aa3SJason Evans+#define	ALLOCM_ERR_OOM		1
418d0e79aa3SJason Evans+#define	ALLOCM_ERR_NOT_MOVED	2
419d0e79aa3SJason Evans+
420d0e79aa3SJason Evans+int
421b7eaed25SJason Evans+je_allocm(void **ptr, size_t *rsize, size_t size, int flags) {
422d0e79aa3SJason Evans+	assert(ptr != NULL);
423d0e79aa3SJason Evans+
424b7eaed25SJason Evans+	void *p = je_mallocx(size, flags);
425b7eaed25SJason Evans+	if (p == NULL) {
426d0e79aa3SJason Evans+		return (ALLOCM_ERR_OOM);
427b7eaed25SJason Evans+	}
428b7eaed25SJason Evans+	if (rsize != NULL) {
429b7eaed25SJason Evans+		*rsize = isalloc(tsdn_fetch(), p);
430b7eaed25SJason Evans+	}
431d0e79aa3SJason Evans+	*ptr = p;
432b7eaed25SJason Evans+	return ALLOCM_SUCCESS;
433d0e79aa3SJason Evans+}
434d0e79aa3SJason Evans+
435d0e79aa3SJason Evans+int
436b7eaed25SJason Evans+je_rallocm(void **ptr, size_t *rsize, size_t size, size_t extra, int flags) {
437d0e79aa3SJason Evans+	assert(ptr != NULL);
438d0e79aa3SJason Evans+	assert(*ptr != NULL);
439d0e79aa3SJason Evans+	assert(size != 0);
440d0e79aa3SJason Evans+	assert(SIZE_T_MAX - size >= extra);
441d0e79aa3SJason Evans+
442b7eaed25SJason Evans+	int ret;
443b7eaed25SJason Evans+	bool no_move = flags & ALLOCM_NO_MOVE;
444b7eaed25SJason Evans+
445d0e79aa3SJason Evans+	if (no_move) {
446d0e79aa3SJason Evans+		size_t usize = je_xallocx(*ptr, size, extra, flags);
447d0e79aa3SJason Evans+		ret = (usize >= size) ? ALLOCM_SUCCESS : ALLOCM_ERR_NOT_MOVED;
448b7eaed25SJason Evans+		if (rsize != NULL) {
449d0e79aa3SJason Evans+			*rsize = usize;
450b7eaed25SJason Evans+		}
451d0e79aa3SJason Evans+	} else {
452d0e79aa3SJason Evans+		void *p = je_rallocx(*ptr, size+extra, flags);
453d0e79aa3SJason Evans+		if (p != NULL) {
454d0e79aa3SJason Evans+			*ptr = p;
455d0e79aa3SJason Evans+			ret = ALLOCM_SUCCESS;
456b7eaed25SJason Evans+		} else {
457d0e79aa3SJason Evans+			ret = ALLOCM_ERR_OOM;
458d0e79aa3SJason Evans+		}
459b7eaed25SJason Evans+		if (rsize != NULL) {
460b7eaed25SJason Evans+			*rsize = isalloc(tsdn_fetch(), *ptr);
461b7eaed25SJason Evans+		}
462b7eaed25SJason Evans+	}
463b7eaed25SJason Evans+	return ret;
464d0e79aa3SJason Evans+}
465d0e79aa3SJason Evans+
466d0e79aa3SJason Evans+int
467b7eaed25SJason Evans+je_sallocm(const void *ptr, size_t *rsize, int flags) {
468d0e79aa3SJason Evans+	assert(rsize != NULL);
469d0e79aa3SJason Evans+	*rsize = je_sallocx(ptr, flags);
470b7eaed25SJason Evans+	return ALLOCM_SUCCESS;
471d0e79aa3SJason Evans+}
472d0e79aa3SJason Evans+
473d0e79aa3SJason Evans+int
474b7eaed25SJason Evans+je_dallocm(void *ptr, int flags) {
475d0e79aa3SJason Evans+	je_dallocx(ptr, flags);
476b7eaed25SJason Evans+	return ALLOCM_SUCCESS;
477d0e79aa3SJason Evans+}
478d0e79aa3SJason Evans+
479d0e79aa3SJason Evans+int
480b7eaed25SJason Evans+je_nallocm(size_t *rsize, size_t size, int flags) {
481b7eaed25SJason Evans+	size_t usize = je_nallocx(size, flags);
482b7eaed25SJason Evans+	if (usize == 0) {
483b7eaed25SJason Evans+		return ALLOCM_ERR_OOM;
484b7eaed25SJason Evans+	}
485b7eaed25SJason Evans+	if (rsize != NULL) {
486d0e79aa3SJason Evans+		*rsize = usize;
487b7eaed25SJason Evans+	}
488b7eaed25SJason Evans+	return ALLOCM_SUCCESS;
489d0e79aa3SJason Evans+}
490d0e79aa3SJason Evans+
491d0e79aa3SJason Evans+#undef ALLOCM_LG_ALIGN
492d0e79aa3SJason Evans+#undef ALLOCM_ALIGN
493d0e79aa3SJason Evans+#undef ALLOCM_ZERO
494d0e79aa3SJason Evans+#undef ALLOCM_NO_MOVE
495d0e79aa3SJason Evans+
496d0e79aa3SJason Evans+#undef ALLOCM_SUCCESS
497d0e79aa3SJason Evans+#undef ALLOCM_ERR_OOM
498d0e79aa3SJason Evans+#undef ALLOCM_ERR_NOT_MOVED
499d0e79aa3SJason Evans+
500d0e79aa3SJason Evans+/*
501d0e79aa3SJason Evans+ * End compatibility functions.
502d0e79aa3SJason Evans+ */
503d0e79aa3SJason Evans+/******************************************************************************/
504c5ad8142SEric van Gyzen /*
505d0e79aa3SJason Evans  * The following functions are used by threading libraries for protection of
506d0e79aa3SJason Evans  * malloc during fork().
507c5ad8142SEric van Gyzen@@ -3919,4 +4001,11 @@ jemalloc_postfork_child(void) {
5081f0a49e8SJason Evans 	ctl_postfork_child(tsd_tsdn(tsd));
509d0e79aa3SJason Evans }
510d0e79aa3SJason Evans
511d0e79aa3SJason Evans+void
512d0e79aa3SJason Evans+_malloc_first_thread(void)
513d0e79aa3SJason Evans+{
514d0e79aa3SJason Evans+
515d0e79aa3SJason Evans+	(void)malloc_mutex_first_thread();
516d0e79aa3SJason Evans+}
517d0e79aa3SJason Evans+
518d0e79aa3SJason Evans /******************************************************************************/
519b7eaed25SJason Evansdiff --git a/src/malloc_io.c b/src/malloc_io.c
520c5ad8142SEric van Gyzenindex d7cb0f52..cda589c4 100644
521b7eaed25SJason Evans--- a/src/malloc_io.c
522b7eaed25SJason Evans+++ b/src/malloc_io.c
5230ef50b4eSJason Evans@@ -75,6 +75,20 @@ wrtmessage(void *cbopaque, const char *s) {
524b7eaed25SJason Evans
525b7eaed25SJason Evans JEMALLOC_EXPORT void	(*je_malloc_message)(void *, const char *s);
526b7eaed25SJason Evans
527b7eaed25SJason Evans+JEMALLOC_ATTR(visibility("hidden"))
528b7eaed25SJason Evans+void
529b7eaed25SJason Evans+wrtmessage_1_0(const char *s1, const char *s2, const char *s3, const char *s4) {
530b7eaed25SJason Evans+
531b7eaed25SJason Evans+	wrtmessage(NULL, s1);
532b7eaed25SJason Evans+	wrtmessage(NULL, s2);
533b7eaed25SJason Evans+	wrtmessage(NULL, s3);
534b7eaed25SJason Evans+	wrtmessage(NULL, s4);
535b7eaed25SJason Evans+}
536b7eaed25SJason Evans+
537b7eaed25SJason Evans+void	(*__malloc_message_1_0)(const char *s1, const char *s2, const char *s3,
538b7eaed25SJason Evans+    const char *s4) = wrtmessage_1_0;
539b7eaed25SJason Evans+__sym_compat(_malloc_message, __malloc_message_1_0, FBSD_1.0);
540b7eaed25SJason Evans+
541b7eaed25SJason Evans /*
542b7eaed25SJason Evans  * Wrapper around malloc_message() that avoids the need for
543b7eaed25SJason Evans  * je_malloc_message(...) throughout the code.
544a4bd5210SJason Evansdiff --git a/src/mutex.c b/src/mutex.c
545c5ad8142SEric van Gyzenindex 3f920f5b..88a7730c 100644
546a4bd5210SJason Evans--- a/src/mutex.c
547a4bd5210SJason Evans+++ b/src/mutex.c
5480ef50b4eSJason Evans@@ -41,6 +41,17 @@ pthread_create(pthread_t *__restrict thread,
549a4bd5210SJason Evans #ifdef JEMALLOC_MUTEX_INIT_CB
55082872ac0SJason Evans JEMALLOC_EXPORT int	_pthread_mutex_init_calloc_cb(pthread_mutex_t *mutex,
551a4bd5210SJason Evans     void *(calloc_cb)(size_t, size_t));
552a4bd5210SJason Evans+
553d0e79aa3SJason Evans+#pragma weak _pthread_mutex_init_calloc_cb
554a4bd5210SJason Evans+int
555d0e79aa3SJason Evans+_pthread_mutex_init_calloc_cb(pthread_mutex_t *mutex,
556a4bd5210SJason Evans+    void *(calloc_cb)(size_t, size_t))
557a4bd5210SJason Evans+{
558a4bd5210SJason Evans+
559d0e79aa3SJason Evans+	return (((int (*)(pthread_mutex_t *, void *(*)(size_t, size_t)))
560d0e79aa3SJason Evans+	    __libc_interposing[INTERPOS__pthread_mutex_init_calloc_cb])(mutex,
561d0e79aa3SJason Evans+	    calloc_cb));
562a4bd5210SJason Evans+}
563a4bd5210SJason Evans #endif
564a4bd5210SJason Evans
565b7eaed25SJason Evans void
5660ef50b4eSJason Evans@@ -131,6 +142,16 @@ mutex_addr_comp(const witness_t *witness1, void *mutex1,
567d0e79aa3SJason Evans 	}
568c5ad8142SEric van Gyzen }
569d0e79aa3SJason Evans
570c5ad8142SEric van Gyzen+bool
571b7eaed25SJason Evans+malloc_mutex_first_thread(void) {
572d0e79aa3SJason Evans+
573d0e79aa3SJason Evans+#ifndef JEMALLOC_MUTEX_INIT_CB
574d0e79aa3SJason Evans+	return (malloc_mutex_first_thread());
575d0e79aa3SJason Evans+#else
576d0e79aa3SJason Evans+	return (false);
577d0e79aa3SJason Evans+#endif
578d0e79aa3SJason Evans+}
579a4bd5210SJason Evans+
580c5ad8142SEric van Gyzen bool
581b7eaed25SJason Evans malloc_mutex_init(malloc_mutex_t *mutex, const char *name,
582b7eaed25SJason Evans     witness_rank_t rank, malloc_mutex_lock_order_t lock_order) {
583