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