xref: /freebsd/contrib/jemalloc/FREEBSD-diffs (revision 0e97acdf58fe27b09c4824a474b0344daf997c5f)
1diff --git a/doc/jemalloc.xml.in b/doc/jemalloc.xml.in
2index d8e2e71..330ba2a 100644
3--- a/doc/jemalloc.xml.in
4+++ b/doc/jemalloc.xml.in
5@@ -57,12 +57,23 @@
6     <para>This manual describes jemalloc @jemalloc_version@.  More information
7     can be found at the <ulink
8     url="http://www.canonware.com/jemalloc/">jemalloc website</ulink>.</para>
9+
10+    <para>The following configuration options are enabled in libc's built-in
11+    jemalloc: <option>--enable-dss</option>,
12+    <option>--enable-experimental</option>, <option>--enable-fill</option>,
13+    <option>--enable-lazy-lock</option>, <option>--enable-munmap</option>,
14+    <option>--enable-stats</option>, <option>--enable-tcache</option>,
15+    <option>--enable-tls</option>, <option>--enable-utrace</option>, and
16+    <option>--enable-xmalloc</option>.  Additionally,
17+    <option>--enable-debug</option> is enabled in development versions of
18+    FreeBSD (controlled by the <constant>MALLOC_PRODUCTION</constant> make
19+    variable).</para>
20   </refsect1>
21   <refsynopsisdiv>
22     <title>SYNOPSIS</title>
23     <funcsynopsis>
24       <funcsynopsisinfo>#include &lt;<filename class="headerfile">stdlib.h</filename>&gt;
25-#include &lt;<filename class="headerfile">jemalloc/jemalloc.h</filename>&gt;</funcsynopsisinfo>
26+#include &lt;<filename class="headerfile">malloc_np.h</filename>&gt;</funcsynopsisinfo>
27       <refsect2>
28         <title>Standard API</title>
29         <funcprototype>
30@@ -2342,4 +2353,19 @@ malloc_conf = "lg_chunk:24";]]></programlisting></para>
31     <para>The <function>posix_memalign<parameter/></function> function conforms
32     to IEEE Std 1003.1-2001 (&ldquo;POSIX.1&rdquo;).</para>
33   </refsect1>
34+  <refsect1 id="history">
35+    <title>HISTORY</title>
36+    <para>The <function>malloc_usable_size<parameter/></function> and
37+    <function>posix_memalign<parameter/></function> functions first appeared in
38+    FreeBSD 7.0.</para>
39+
40+    <para>The <function>aligned_alloc<parameter/></function>,
41+    <function>malloc_stats_print<parameter/></function>,
42+    <function>mallctl*<parameter/></function>, and
43+    <function>*allocm<parameter/></function> functions first appeared in
44+    FreeBSD 10.0.</para>
45+
46+    <para>The <function>*allocx<parameter/></function> functions first appeared
47+    in FreeBSD 11.0.</para>
48+  </refsect1>
49 </refentry>
50diff --git a/include/jemalloc/internal/jemalloc_internal.h.in b/include/jemalloc/internal/jemalloc_internal.h.in
51index 574bbb1..e3eafdf 100644
52--- a/include/jemalloc/internal/jemalloc_internal.h.in
53+++ b/include/jemalloc/internal/jemalloc_internal.h.in
54@@ -1,5 +1,8 @@
55 #ifndef JEMALLOC_INTERNAL_H
56 #define	JEMALLOC_INTERNAL_H
57+#include "libc_private.h"
58+#include "namespace.h"
59+
60 #include <math.h>
61 #ifdef _WIN32
62 #  include <windows.h>
63@@ -65,6 +68,9 @@ typedef intptr_t ssize_t;
64 #include <valgrind/memcheck.h>
65 #endif
66
67+#include "un-namespace.h"
68+#include "libc_private.h"
69+
70 #define	JEMALLOC_NO_DEMANGLE
71 #ifdef JEMALLOC_JET
72 #  define JEMALLOC_N(n) jet_##n
73@@ -99,13 +105,7 @@ static const bool config_fill =
74     false
75 #endif
76     ;
77-static const bool config_lazy_lock =
78-#ifdef JEMALLOC_LAZY_LOCK
79-    true
80-#else
81-    false
82-#endif
83-    ;
84+static const bool config_lazy_lock = true;
85 static const bool config_prof =
86 #ifdef JEMALLOC_PROF
87     true
88diff --git a/include/jemalloc/internal/mutex.h b/include/jemalloc/internal/mutex.h
89index de44e14..564d604 100644
90--- a/include/jemalloc/internal/mutex.h
91+++ b/include/jemalloc/internal/mutex.h
92@@ -43,9 +43,6 @@ struct malloc_mutex_s {
93
94 #ifdef JEMALLOC_LAZY_LOCK
95 extern bool isthreaded;
96-#else
97-#  undef isthreaded /* Undo private_namespace.h definition. */
98-#  define isthreaded true
99 #endif
100
101 bool	malloc_mutex_init(malloc_mutex_t *mutex);
102diff --git a/include/jemalloc/internal/private_symbols.txt b/include/jemalloc/internal/private_symbols.txt
103index 93516d2..22f9af9 100644
104--- a/include/jemalloc/internal/private_symbols.txt
105+++ b/include/jemalloc/internal/private_symbols.txt
106@@ -226,7 +226,6 @@ iralloc
107 iralloct
108 iralloct_realign
109 isalloc
110-isthreaded
111 ivsalloc
112 ixalloc
113 jemalloc_postfork_child
114diff --git a/include/jemalloc/jemalloc_FreeBSD.h b/include/jemalloc/jemalloc_FreeBSD.h
115new file mode 100644
116index 0000000..94554bc
117--- /dev/null
118+++ b/include/jemalloc/jemalloc_FreeBSD.h
119@@ -0,0 +1,134 @@
120+/*
121+ * Override settings that were generated in jemalloc_defs.h as necessary.
122+ */
123+
124+#undef JEMALLOC_OVERRIDE_VALLOC
125+
126+#ifndef MALLOC_PRODUCTION
127+#define	JEMALLOC_DEBUG
128+#endif
129+
130+/*
131+ * The following are architecture-dependent, so conditionally define them for
132+ * each supported architecture.
133+ */
134+#undef CPU_SPINWAIT
135+#undef JEMALLOC_TLS_MODEL
136+#undef STATIC_PAGE_SHIFT
137+#undef LG_SIZEOF_PTR
138+#undef LG_SIZEOF_INT
139+#undef LG_SIZEOF_LONG
140+#undef LG_SIZEOF_INTMAX_T
141+
142+#ifdef __i386__
143+#  define LG_SIZEOF_PTR		2
144+#  define CPU_SPINWAIT		__asm__ volatile("pause")
145+#  define JEMALLOC_TLS_MODEL	__attribute__((tls_model("initial-exec")))
146+#endif
147+#ifdef __ia64__
148+#  define LG_SIZEOF_PTR		3
149+#endif
150+#ifdef __sparc64__
151+#  define LG_SIZEOF_PTR		3
152+#  define JEMALLOC_TLS_MODEL	__attribute__((tls_model("initial-exec")))
153+#endif
154+#ifdef __amd64__
155+#  define LG_SIZEOF_PTR		3
156+#  define CPU_SPINWAIT		__asm__ volatile("pause")
157+#  define JEMALLOC_TLS_MODEL	__attribute__((tls_model("initial-exec")))
158+#endif
159+#ifdef __arm__
160+#  define LG_SIZEOF_PTR		2
161+#endif
162+#ifdef __mips__
163+#ifdef __mips_n64
164+#  define LG_SIZEOF_PTR		3
165+#else
166+#  define LG_SIZEOF_PTR		2
167+#endif
168+#endif
169+#ifdef __powerpc64__
170+#  define LG_SIZEOF_PTR		3
171+#elif defined(__powerpc__)
172+#  define LG_SIZEOF_PTR		2
173+#endif
174+
175+#ifndef JEMALLOC_TLS_MODEL
176+#  define JEMALLOC_TLS_MODEL	/* Default. */
177+#endif
178+
179+#define	STATIC_PAGE_SHIFT	PAGE_SHIFT
180+#define	LG_SIZEOF_INT		2
181+#define	LG_SIZEOF_LONG		LG_SIZEOF_PTR
182+#define	LG_SIZEOF_INTMAX_T	3
183+
184+/* Disable lazy-lock machinery, mangle isthreaded, and adjust its type. */
185+#undef JEMALLOC_LAZY_LOCK
186+extern int __isthreaded;
187+#define	isthreaded		((bool)__isthreaded)
188+
189+/* Mangle. */
190+#undef je_malloc
191+#undef je_calloc
192+#undef je_realloc
193+#undef je_free
194+#undef je_posix_memalign
195+#undef je_malloc_usable_size
196+#undef je_mallocx
197+#undef je_rallocx
198+#undef je_xallocx
199+#undef je_sallocx
200+#undef je_dallocx
201+#undef je_nallocx
202+#undef je_allocm
203+#undef je_rallocm
204+#undef je_sallocm
205+#undef je_dallocm
206+#undef je_nallocm
207+#define	je_malloc		__malloc
208+#define	je_calloc		__calloc
209+#define	je_realloc		__realloc
210+#define	je_free			__free
211+#define	je_posix_memalign	__posix_memalign
212+#define	je_malloc_usable_size	__malloc_usable_size
213+#define	je_mallocx		__mallocx
214+#define	je_rallocx		__rallocx
215+#define	je_xallocx		__xallocx
216+#define	je_sallocx		__sallocx
217+#define	je_dallocx		__dallocx
218+#define	je_nallocx		__nallocx
219+#define	je_allocm		__allocm
220+#define	je_rallocm		__rallocm
221+#define	je_sallocm		__sallocm
222+#define	je_dallocm		__dallocm
223+#define	je_nallocm		__nallocm
224+#define	open			_open
225+#define	read			_read
226+#define	write			_write
227+#define	close			_close
228+#define	pthread_mutex_lock	_pthread_mutex_lock
229+#define	pthread_mutex_unlock	_pthread_mutex_unlock
230+
231+#ifdef JEMALLOC_C_
232+/*
233+ * Define 'weak' symbols so that an application can have its own versions
234+ * of malloc, calloc, realloc, free, et al.
235+ */
236+__weak_reference(__malloc, malloc);
237+__weak_reference(__calloc, calloc);
238+__weak_reference(__realloc, realloc);
239+__weak_reference(__free, free);
240+__weak_reference(__posix_memalign, posix_memalign);
241+__weak_reference(__malloc_usable_size, malloc_usable_size);
242+__weak_reference(__mallocx, mallocx);
243+__weak_reference(__rallocx, rallocx);
244+__weak_reference(__xallocx, xallocx);
245+__weak_reference(__sallocx, sallocx);
246+__weak_reference(__dallocx, dallocx);
247+__weak_reference(__nallocx, nallocx);
248+__weak_reference(__allocm, allocm);
249+__weak_reference(__rallocm, rallocm);
250+__weak_reference(__sallocm, sallocm);
251+__weak_reference(__dallocm, dallocm);
252+__weak_reference(__nallocm, nallocm);
253+#endif
254diff --git a/include/jemalloc/jemalloc_rename.sh b/include/jemalloc/jemalloc_rename.sh
255index f943891..47d032c 100755
256--- a/include/jemalloc/jemalloc_rename.sh
257+++ b/include/jemalloc/jemalloc_rename.sh
258@@ -19,4 +19,6 @@ done
259
260 cat <<EOF
261 #endif
262+
263+#include "jemalloc_FreeBSD.h"
264 EOF
265diff --git a/src/jemalloc.c b/src/jemalloc.c
266index 204778b..9e5f2df 100644
267--- a/src/jemalloc.c
268+++ b/src/jemalloc.c
269@@ -8,6 +8,10 @@ malloc_tsd_data(, arenas, arena_t *, NULL)
270 malloc_tsd_data(, thread_allocated, thread_allocated_t,
271     THREAD_ALLOCATED_INITIALIZER)
272
273+/* Work around <http://llvm.org/bugs/show_bug.cgi?id=12623>: */
274+const char	*__malloc_options_1_0 = NULL;
275+__sym_compat(_malloc_options, __malloc_options_1_0, FBSD_1.0);
276+
277 /* Runtime configuration options. */
278 const char	*je_malloc_conf;
279 bool	opt_abort =
280@@ -457,7 +461,8 @@ malloc_conf_init(void)
281 #endif
282 			    ;
283
284-			if ((opts = getenv(envname)) != NULL) {
285+			if (issetugid() == 0 && (opts = getenv(envname)) !=
286+			    NULL) {
287 				/*
288 				 * Do nothing; opts is already initialized to
289 				 * the value of the MALLOC_CONF environment
290diff --git a/src/mutex.c b/src/mutex.c
291index 788eca3..6f5954e 100644
292--- a/src/mutex.c
293+++ b/src/mutex.c
294@@ -66,6 +66,17 @@ pthread_create(pthread_t *__restrict thread,
295 #ifdef JEMALLOC_MUTEX_INIT_CB
296 JEMALLOC_EXPORT int	_pthread_mutex_init_calloc_cb(pthread_mutex_t *mutex,
297     void *(calloc_cb)(size_t, size_t));
298+
299+__weak_reference(_pthread_mutex_init_calloc_cb_stub,
300+    _pthread_mutex_init_calloc_cb);
301+
302+int
303+_pthread_mutex_init_calloc_cb_stub(pthread_mutex_t *mutex,
304+    void *(calloc_cb)(size_t, size_t))
305+{
306+
307+	return (0);
308+}
309 #endif
310
311 bool
312diff --git a/src/util.c b/src/util.c
313index 93a19fd..70b3e45 100644
314--- a/src/util.c
315+++ b/src/util.c
316@@ -58,6 +58,22 @@ wrtmessage(void *cbopaque, const char *s)
317
318 JEMALLOC_EXPORT void	(*je_malloc_message)(void *, const char *s);
319
320+JEMALLOC_ATTR(visibility("hidden"))
321+void
322+wrtmessage_1_0(const char *s1, const char *s2, const char *s3,
323+    const char *s4)
324+{
325+
326+	wrtmessage(NULL, s1);
327+	wrtmessage(NULL, s2);
328+	wrtmessage(NULL, s3);
329+	wrtmessage(NULL, s4);
330+}
331+
332+void	(*__malloc_message_1_0)(const char *s1, const char *s2, const char *s3,
333+    const char *s4) = wrtmessage_1_0;
334+__sym_compat(_malloc_message, __malloc_message_1_0, FBSD_1.0);
335+
336 /*
337  * Wrapper around malloc_message() that avoids the need for
338  * je_malloc_message(...) throughout the code.
339