xref: /freebsd/contrib/jemalloc/FREEBSD-diffs (revision 84dfba8d183d31e3412639ecb4b8ad4433cf7e80)
1diff --git a/doc/jemalloc.xml.in b/doc/jemalloc.xml.in
2index abd5e6f..1d7491a 100644
3--- a/doc/jemalloc.xml.in
4+++ b/doc/jemalloc.xml.in
5@@ -51,12 +51,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@@ -2180,4 +2191,16 @@ 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+  </refsect1>
46 </refentry>
47diff --git a/include/jemalloc/internal/jemalloc_internal.h.in b/include/jemalloc/internal/jemalloc_internal.h.in
48index 53c135c..c547339 100644
49--- a/include/jemalloc/internal/jemalloc_internal.h.in
50+++ b/include/jemalloc/internal/jemalloc_internal.h.in
51@@ -1,5 +1,8 @@
52 #ifndef JEMALLOC_INTERNAL_H
53 #define JEMALLOC_INTERNAL_H
54+#include "libc_private.h"
55+#include "namespace.h"
56+
57 #include <math.h>
58 #ifdef _WIN32
59 #  include <windows.h>
60@@ -54,6 +57,9 @@ typedef intptr_t ssize_t;
61 #endif
62 #include <fcntl.h>
63
64+#include "un-namespace.h"
65+#include "libc_private.h"
66+
67 #define	JEMALLOC_NO_DEMANGLE
68 #include "../jemalloc@install_suffix@.h"
69
70@@ -95,13 +101,7 @@ static const bool config_fill =
71     false
72 #endif
73     ;
74-static const bool config_lazy_lock =
75-#ifdef JEMALLOC_LAZY_LOCK
76-    true
77-#else
78-    false
79-#endif
80-    ;
81+static const bool config_lazy_lock = true;
82 static const bool config_prof =
83 #ifdef JEMALLOC_PROF
84     true
85diff --git a/include/jemalloc/internal/mutex.h b/include/jemalloc/internal/mutex.h
86index de44e14..564d604 100644
87--- a/include/jemalloc/internal/mutex.h
88+++ b/include/jemalloc/internal/mutex.h
89@@ -43,9 +43,6 @@ struct malloc_mutex_s {
90
91 #ifdef JEMALLOC_LAZY_LOCK
92 extern bool isthreaded;
93-#else
94-#  undef isthreaded /* Undo private_namespace.h definition. */
95-#  define isthreaded true
96 #endif
97
98 bool	malloc_mutex_init(malloc_mutex_t *mutex);
99diff --git a/include/jemalloc/internal/private_namespace.h b/include/jemalloc/internal/private_namespace.h
100index cdb0b0e..2a98d1f 100644
101--- a/include/jemalloc/internal/private_namespace.h
102+++ b/include/jemalloc/internal/private_namespace.h
103@@ -218,7 +218,6 @@
104 #define	iralloc JEMALLOC_N(iralloc)
105 #define	irallocx JEMALLOC_N(irallocx)
106 #define	isalloc JEMALLOC_N(isalloc)
107-#define	isthreaded JEMALLOC_N(isthreaded)
108 #define	ivsalloc JEMALLOC_N(ivsalloc)
109 #define	jemalloc_postfork_child JEMALLOC_N(jemalloc_postfork_child)
110 #define	jemalloc_postfork_parent JEMALLOC_N(jemalloc_postfork_parent)
111diff --git a/include/jemalloc/jemalloc.h.in b/include/jemalloc/jemalloc.h.in
112index 31b1304..c3ef2f5 100644
113--- a/include/jemalloc/jemalloc.h.in
114+++ b/include/jemalloc/jemalloc.h.in
115@@ -15,6 +15,7 @@ extern "C" {
116 #define	JEMALLOC_VERSION_GID "@jemalloc_version_gid@"
117
118 #include "jemalloc_defs@install_suffix@.h"
119+#include "jemalloc_FreeBSD.h"
120
121 #ifdef JEMALLOC_EXPERIMENTAL
122 #define	ALLOCM_LG_ALIGN(la)	(la)
123diff --git a/include/jemalloc/jemalloc_FreeBSD.h b/include/jemalloc/jemalloc_FreeBSD.h
124new file mode 100644
125index 0000000..e6c8407
126--- /dev/null
127+++ b/include/jemalloc/jemalloc_FreeBSD.h
128@@ -0,0 +1,117 @@
129+/*
130+ * Override settings that were generated in jemalloc_defs.h as necessary.
131+ */
132+
133+#undef JEMALLOC_OVERRIDE_VALLOC
134+
135+#ifndef MALLOC_PRODUCTION
136+#define	JEMALLOC_DEBUG
137+#endif
138+
139+/*
140+ * The following are architecture-dependent, so conditionally define them for
141+ * each supported architecture.
142+ */
143+#undef CPU_SPINWAIT
144+#undef JEMALLOC_TLS_MODEL
145+#undef STATIC_PAGE_SHIFT
146+#undef LG_SIZEOF_PTR
147+#undef LG_SIZEOF_INT
148+#undef LG_SIZEOF_LONG
149+#undef LG_SIZEOF_INTMAX_T
150+
151+#ifdef __i386__
152+#  define LG_SIZEOF_PTR		2
153+#  define CPU_SPINWAIT		__asm__ volatile("pause")
154+#  define JEMALLOC_TLS_MODEL	__attribute__((tls_model("initial-exec")))
155+#endif
156+#ifdef __ia64__
157+#  define LG_SIZEOF_PTR		3
158+#endif
159+#ifdef __sparc64__
160+#  define LG_SIZEOF_PTR		3
161+#  define JEMALLOC_TLS_MODEL	__attribute__((tls_model("initial-exec")))
162+#endif
163+#ifdef __amd64__
164+#  define LG_SIZEOF_PTR		3
165+#  define CPU_SPINWAIT		__asm__ volatile("pause")
166+#  define JEMALLOC_TLS_MODEL	__attribute__((tls_model("initial-exec")))
167+#endif
168+#ifdef __arm__
169+#  define LG_SIZEOF_PTR		2
170+#endif
171+#ifdef __mips__
172+#ifdef __mips_n64
173+#  define LG_SIZEOF_PTR		3
174+#else
175+#  define LG_SIZEOF_PTR		2
176+#endif
177+#endif
178+#ifdef __powerpc64__
179+#  define LG_SIZEOF_PTR		3
180+#elif defined(__powerpc__)
181+#  define LG_SIZEOF_PTR		2
182+#endif
183+
184+#ifndef JEMALLOC_TLS_MODEL
185+#  define JEMALLOC_TLS_MODEL	/* Default. */
186+#endif
187+
188+#define	STATIC_PAGE_SHIFT	PAGE_SHIFT
189+#define	LG_SIZEOF_INT		2
190+#define	LG_SIZEOF_LONG		LG_SIZEOF_PTR
191+#define	LG_SIZEOF_INTMAX_T	3
192+
193+/* Disable lazy-lock machinery, mangle isthreaded, and adjust its type. */
194+#undef JEMALLOC_LAZY_LOCK
195+extern int __isthreaded;
196+#define	isthreaded		((bool)__isthreaded)
197+
198+/* Mangle. */
199+#undef je_malloc
200+#undef je_calloc
201+#undef je_realloc
202+#undef je_free
203+#undef je_posix_memalign
204+#undef je_malloc_usable_size
205+#undef je_allocm
206+#undef je_rallocm
207+#undef je_sallocm
208+#undef je_dallocm
209+#undef je_nallocm
210+#define	je_malloc		__malloc
211+#define	je_calloc		__calloc
212+#define	je_realloc		__realloc
213+#define	je_free			__free
214+#define	je_posix_memalign	__posix_memalign
215+#define	je_malloc_usable_size	__malloc_usable_size
216+#define	je_allocm		__allocm
217+#define	je_rallocm		__rallocm
218+#define	je_sallocm		__sallocm
219+#define	je_dallocm		__dallocm
220+#define	je_nallocm		__nallocm
221+#define	open			_open
222+#define	read			_read
223+#define	write			_write
224+#define	close			_close
225+#define	pthread_mutex_lock	_pthread_mutex_lock
226+#define	pthread_mutex_unlock	_pthread_mutex_unlock
227+
228+#ifdef JEMALLOC_C_
229+/*
230+ * Define 'weak' symbols so that an application can have its own versions
231+ * of malloc, calloc, realloc, free, et al.
232+ */
233+__weak_reference(__malloc, malloc);
234+__weak_reference(__calloc, calloc);
235+__weak_reference(__realloc, realloc);
236+__weak_reference(__free, free);
237+__weak_reference(__posix_memalign, posix_memalign);
238+__weak_reference(__malloc_usable_size, malloc_usable_size);
239+__weak_reference(__allocm, allocm);
240+__weak_reference(__rallocm, rallocm);
241+__weak_reference(__sallocm, sallocm);
242+__weak_reference(__dallocm, dallocm);
243+__weak_reference(__nallocm, nallocm);
244+#endif
245+
246diff --git a/src/jemalloc.c b/src/jemalloc.c
247index ae56db6..1412a5e 100644
248--- a/src/jemalloc.c
249+++ b/src/jemalloc.c
250@@ -8,6 +8,10 @@ malloc_tsd_data(, arenas, arena_t *, NULL)
251 malloc_tsd_data(, thread_allocated, thread_allocated_t,
252     THREAD_ALLOCATED_INITIALIZER)
253
254+/* Work around <http://llvm.org/bugs/show_bug.cgi?id=12623>: */
255+const char	*__malloc_options_1_0 = NULL;
256+__sym_compat(_malloc_options, __malloc_options_1_0, FBSD_1.0);
257+
258 /* Runtime configuration options. */
259 const char	*je_malloc_conf;
260 bool	opt_abort =
261@@ -471,7 +475,8 @@ malloc_conf_init(void)
262 #endif
263 			    ;
264
265-			if ((opts = getenv(envname)) != NULL) {
266+			if (issetugid() == 0 && (opts = getenv(envname)) !=
267+			    NULL) {
268 				/*
269 				 * Do nothing; opts is already initialized to
270 				 * the value of the MALLOC_CONF environment
271diff --git a/src/mutex.c b/src/mutex.c
272index 55e18c2..6b6f438 100644
273--- a/src/mutex.c
274+++ b/src/mutex.c
275@@ -66,6 +66,17 @@ pthread_create(pthread_t *__restrict thread,
276 #ifdef JEMALLOC_MUTEX_INIT_CB
277 JEMALLOC_EXPORT int	_pthread_mutex_init_calloc_cb(pthread_mutex_t *mutex,
278     void *(calloc_cb)(size_t, size_t));
279+
280+__weak_reference(_pthread_mutex_init_calloc_cb_stub,
281+    _pthread_mutex_init_calloc_cb);
282+
283+int
284+_pthread_mutex_init_calloc_cb_stub(pthread_mutex_t *mutex,
285+    void *(calloc_cb)(size_t, size_t))
286+{
287+
288+	return (0);
289+}
290 #endif
291
292 bool
293diff --git a/src/util.c b/src/util.c
294index b3a0114..df1c5d5 100644
295--- a/src/util.c
296+++ b/src/util.c
297@@ -58,6 +58,22 @@ wrtmessage(void *cbopaque, const char *s)
298
299 JEMALLOC_EXPORT void	(*je_malloc_message)(void *, const char *s);
300
301+JEMALLOC_ATTR(visibility("hidden"))
302+void
303+wrtmessage_1_0(const char *s1, const char *s2, const char *s3,
304+    const char *s4)
305+{
306+
307+	wrtmessage(NULL, s1);
308+	wrtmessage(NULL, s2);
309+	wrtmessage(NULL, s3);
310+	wrtmessage(NULL, s4);
311+}
312+
313+void	(*__malloc_message_1_0)(const char *s1, const char *s2, const char *s3,
314+    const char *s4) = wrtmessage_1_0;
315+__sym_compat(_malloc_message, __malloc_message_1_0, FBSD_1.0);
316+
317 /*
318  * Wrapper around malloc_message() that avoids the need for
319  * je_malloc_message(...) throughout the code.
320