prior to 3.0.0 release). This fixes several bugs related to memory initialization. Mangle __jemalloc_a0{malloc,calloc,free}() just like all the other library-internal symbols in jemalloc, and adjust the tls allocation code in libc to use the mangled names.
263 lines
8.4 KiB
Plaintext
263 lines
8.4 KiB
Plaintext
diff --git a/doc/jemalloc.xml.in b/doc/jemalloc.xml.in
|
|
index e8a5722..cec85b5 100644
|
|
--- a/doc/jemalloc.xml.in
|
|
+++ b/doc/jemalloc.xml.in
|
|
@@ -51,12 +51,23 @@
|
|
<para>This manual describes jemalloc @jemalloc_version@. More information
|
|
can be found at the <ulink
|
|
url="http://www.canonware.com/jemalloc/">jemalloc website</ulink>.</para>
|
|
+
|
|
+ <para>The following configuration options are enabled in libc's built-in
|
|
+ jemalloc: <option>--enable-dss</option>,
|
|
+ <option>--enable-experimental</option>, <option>--enable-fill</option>,
|
|
+ <option>--enable-lazy-lock</option>, <option>--enable-munmap</option>,
|
|
+ <option>--enable-stats</option>, <option>--enable-tcache</option>,
|
|
+ <option>--enable-tls</option>, <option>--enable-utrace</option>, and
|
|
+ <option>--enable-xmalloc</option>. Additionally,
|
|
+ <option>--enable-debug</option> is enabled in development versions of
|
|
+ FreeBSD (controlled by the <constant>MALLOC_PRODUCTION</constant> make
|
|
+ variable).</para>
|
|
</refsect1>
|
|
<refsynopsisdiv>
|
|
<title>SYNOPSIS</title>
|
|
<funcsynopsis>
|
|
<funcsynopsisinfo>#include <<filename class="headerfile">stdlib.h</filename>>
|
|
-#include <<filename class="headerfile">jemalloc/jemalloc.h</filename>></funcsynopsisinfo>
|
|
+#include <<filename class="headerfile">malloc_np.h</filename>></funcsynopsisinfo>
|
|
<refsect2>
|
|
<title>Standard API</title>
|
|
<funcprototype>
|
|
@@ -2091,4 +2102,16 @@ malloc_conf = "lg_chunk:24";]]></programlisting></para>
|
|
<para>The <function>posix_memalign<parameter/></function> function conforms
|
|
to IEEE Std 1003.1-2001 (“POSIX.1”).</para>
|
|
</refsect1>
|
|
+ <refsect1 id="history">
|
|
+ <title>HISTORY</title>
|
|
+ <para>The <function>malloc_usable_size<parameter/></function> and
|
|
+ <function>posix_memalign<parameter/></function> functions first appeared in
|
|
+ FreeBSD 7.0.</para>
|
|
+
|
|
+ <para>The <function>aligned_alloc<parameter/></function>,
|
|
+ <function>malloc_stats_print<parameter/></function>,
|
|
+ <function>mallctl*<parameter/></function>, and
|
|
+ <function>*allocm<parameter/></function> functions first appeared in
|
|
+ FreeBSD 10.0.</para>
|
|
+ </refsect1>
|
|
</refentry>
|
|
diff --git a/include/jemalloc/internal/jemalloc_internal.h.in b/include/jemalloc/internal/jemalloc_internal.h.in
|
|
index b61abe8..edbb437 100644
|
|
--- a/include/jemalloc/internal/jemalloc_internal.h.in
|
|
+++ b/include/jemalloc/internal/jemalloc_internal.h.in
|
|
@@ -1,5 +1,8 @@
|
|
#ifndef JEMALLOC_INTERNAL_H
|
|
#define JEMALLOC_INTERNAL_H
|
|
+#include "libc_private.h"
|
|
+#include "namespace.h"
|
|
+
|
|
#include <sys/mman.h>
|
|
#include <sys/param.h>
|
|
#include <sys/syscall.h>
|
|
@@ -35,6 +38,9 @@
|
|
#include <pthread.h>
|
|
#include <math.h>
|
|
|
|
+#include "un-namespace.h"
|
|
+#include "libc_private.h"
|
|
+
|
|
#define JEMALLOC_NO_DEMANGLE
|
|
#include "../jemalloc@install_suffix@.h"
|
|
|
|
diff --git a/include/jemalloc/internal/mutex.h b/include/jemalloc/internal/mutex.h
|
|
index 8837ef5..d7133f4 100644
|
|
--- a/include/jemalloc/internal/mutex.h
|
|
+++ b/include/jemalloc/internal/mutex.h
|
|
@@ -39,9 +39,6 @@ struct malloc_mutex_s {
|
|
|
|
#ifdef JEMALLOC_LAZY_LOCK
|
|
extern bool isthreaded;
|
|
-#else
|
|
-# undef isthreaded /* Undo private_namespace.h definition. */
|
|
-# define isthreaded true
|
|
#endif
|
|
|
|
bool malloc_mutex_init(malloc_mutex_t *mutex);
|
|
diff --git a/include/jemalloc/internal/private_namespace.h b/include/jemalloc/internal/private_namespace.h
|
|
index bb1b63e..00eb169 100644
|
|
--- a/include/jemalloc/internal/private_namespace.h
|
|
+++ b/include/jemalloc/internal/private_namespace.h
|
|
@@ -165,7 +165,6 @@
|
|
#define iqalloc JEMALLOC_N(iqalloc)
|
|
#define iralloc JEMALLOC_N(iralloc)
|
|
#define isalloc JEMALLOC_N(isalloc)
|
|
-#define isthreaded JEMALLOC_N(isthreaded)
|
|
#define ivsalloc JEMALLOC_N(ivsalloc)
|
|
#define jemalloc_postfork_child JEMALLOC_N(jemalloc_postfork_child)
|
|
#define jemalloc_postfork_parent JEMALLOC_N(jemalloc_postfork_parent)
|
|
diff --git a/include/jemalloc/jemalloc.h.in b/include/jemalloc/jemalloc.h.in
|
|
index f0581db..f26d8bc 100644
|
|
--- a/include/jemalloc/jemalloc.h.in
|
|
+++ b/include/jemalloc/jemalloc.h.in
|
|
@@ -15,6 +15,7 @@ extern "C" {
|
|
#define JEMALLOC_VERSION_GID "@jemalloc_version_gid@"
|
|
|
|
#include "jemalloc_defs@install_suffix@.h"
|
|
+#include "jemalloc_FreeBSD.h"
|
|
|
|
#ifdef JEMALLOC_EXPERIMENTAL
|
|
#define ALLOCM_LG_ALIGN(la) (la)
|
|
diff --git a/include/jemalloc/jemalloc_FreeBSD.h b/include/jemalloc/jemalloc_FreeBSD.h
|
|
new file mode 100644
|
|
index 0000000..2c5797f
|
|
--- /dev/null
|
|
+++ b/include/jemalloc/jemalloc_FreeBSD.h
|
|
@@ -0,0 +1,76 @@
|
|
+/*
|
|
+ * Override settings that were generated in jemalloc_defs.h as necessary.
|
|
+ */
|
|
+
|
|
+#undef JEMALLOC_OVERRIDE_VALLOC
|
|
+
|
|
+#ifndef MALLOC_PRODUCTION
|
|
+#define JEMALLOC_DEBUG
|
|
+#endif
|
|
+
|
|
+/*
|
|
+ * The following are architecture-dependent, so conditionally define them for
|
|
+ * each supported architecture.
|
|
+ */
|
|
+#undef CPU_SPINWAIT
|
|
+#undef JEMALLOC_TLS_MODEL
|
|
+#undef STATIC_PAGE_SHIFT
|
|
+#undef LG_SIZEOF_PTR
|
|
+#undef LG_SIZEOF_INT
|
|
+#undef LG_SIZEOF_LONG
|
|
+#undef LG_SIZEOF_INTMAX_T
|
|
+
|
|
+#ifdef __i386__
|
|
+# define LG_SIZEOF_PTR 2
|
|
+# define CPU_SPINWAIT __asm__ volatile("pause")
|
|
+# define JEMALLOC_TLS_MODEL __attribute__((tls_model("initial-exec")))
|
|
+#endif
|
|
+#ifdef __ia64__
|
|
+# define LG_SIZEOF_PTR 3
|
|
+#endif
|
|
+#ifdef __sparc64__
|
|
+# define LG_SIZEOF_PTR 3
|
|
+# define JEMALLOC_TLS_MODEL __attribute__((tls_model("initial-exec")))
|
|
+#endif
|
|
+#ifdef __amd64__
|
|
+# define LG_SIZEOF_PTR 3
|
|
+# define CPU_SPINWAIT __asm__ volatile("pause")
|
|
+# define JEMALLOC_TLS_MODEL __attribute__((tls_model("initial-exec")))
|
|
+#endif
|
|
+#ifdef __arm__
|
|
+# define LG_SIZEOF_PTR 2
|
|
+#endif
|
|
+#ifdef __mips__
|
|
+# define LG_SIZEOF_PTR 2
|
|
+#endif
|
|
+#ifdef __powerpc64__
|
|
+# define LG_SIZEOF_PTR 3
|
|
+#elif defined(__powerpc__)
|
|
+# define LG_SIZEOF_PTR 2
|
|
+#endif
|
|
+
|
|
+#ifndef JEMALLOC_TLS_MODEL
|
|
+# define JEMALLOC_TLS_MODEL /* Default. */
|
|
+#endif
|
|
+#ifdef __clang__
|
|
+# undef JEMALLOC_TLS_MODEL
|
|
+# define JEMALLOC_TLS_MODEL /* clang does not support tls_model yet. */
|
|
+#endif
|
|
+
|
|
+#define STATIC_PAGE_SHIFT PAGE_SHIFT
|
|
+#define LG_SIZEOF_INT 2
|
|
+#define LG_SIZEOF_LONG LG_SIZEOF_PTR
|
|
+#define LG_SIZEOF_INTMAX_T 3
|
|
+
|
|
+/* Disable lazy-lock machinery, mangle isthreaded, and adjust its type. */
|
|
+#undef JEMALLOC_LAZY_LOCK
|
|
+extern int __isthreaded;
|
|
+#define isthreaded ((bool)__isthreaded)
|
|
+
|
|
+/* Mangle. */
|
|
+#define open _open
|
|
+#define read _read
|
|
+#define write _write
|
|
+#define close _close
|
|
+#define pthread_mutex_lock _pthread_mutex_lock
|
|
+#define pthread_mutex_unlock _pthread_mutex_unlock
|
|
diff --git a/src/jemalloc.c b/src/jemalloc.c
|
|
index f9c8916..8e24a5a 100644
|
|
--- a/src/jemalloc.c
|
|
+++ b/src/jemalloc.c
|
|
@@ -8,6 +8,9 @@ malloc_tsd_data(, arenas, arena_t *, NULL)
|
|
malloc_tsd_data(, thread_allocated, thread_allocated_t,
|
|
THREAD_ALLOCATED_INITIALIZER)
|
|
|
|
+const char *__malloc_options_1_0;
|
|
+__sym_compat(_malloc_options, __malloc_options_1_0, FBSD_1.0);
|
|
+
|
|
/* Runtime configuration options. */
|
|
const char *je_malloc_conf JEMALLOC_ATTR(visibility("default"));
|
|
#ifdef JEMALLOC_DEBUG
|
|
@@ -401,7 +404,8 @@ malloc_conf_init(void)
|
|
#endif
|
|
;
|
|
|
|
- if ((opts = getenv(envname)) != NULL) {
|
|
+ if (issetugid() == 0 && (opts = getenv(envname)) !=
|
|
+ NULL) {
|
|
/*
|
|
* Do nothing; opts is already initialized to
|
|
* the value of the MALLOC_CONF environment
|
|
diff --git a/src/mutex.c b/src/mutex.c
|
|
index 4b8ce57..7be5fc9 100644
|
|
--- a/src/mutex.c
|
|
+++ b/src/mutex.c
|
|
@@ -63,6 +63,17 @@ pthread_create(pthread_t *__restrict thread,
|
|
#ifdef JEMALLOC_MUTEX_INIT_CB
|
|
int _pthread_mutex_init_calloc_cb(pthread_mutex_t *mutex,
|
|
void *(calloc_cb)(size_t, size_t));
|
|
+
|
|
+__weak_reference(_pthread_mutex_init_calloc_cb_stub,
|
|
+ _pthread_mutex_init_calloc_cb);
|
|
+
|
|
+int
|
|
+_pthread_mutex_init_calloc_cb_stub(pthread_mutex_t *mutex,
|
|
+ void *(calloc_cb)(size_t, size_t))
|
|
+{
|
|
+
|
|
+ return (0);
|
|
+}
|
|
#endif
|
|
|
|
bool
|
|
diff --git a/src/util.c b/src/util.c
|
|
index 99ae26d..b80676c 100644
|
|
--- a/src/util.c
|
|
+++ b/src/util.c
|
|
@@ -60,6 +60,22 @@ wrtmessage(void *cbopaque, const char *s)
|
|
void (*je_malloc_message)(void *, const char *s)
|
|
JEMALLOC_ATTR(visibility("default")) = wrtmessage;
|
|
|
|
+JEMALLOC_CATTR(visibility("hidden"), static)
|
|
+void
|
|
+wrtmessage_1_0(const char *s1, const char *s2, const char *s3,
|
|
+ const char *s4)
|
|
+{
|
|
+
|
|
+ wrtmessage(NULL, s1);
|
|
+ wrtmessage(NULL, s2);
|
|
+ wrtmessage(NULL, s3);
|
|
+ wrtmessage(NULL, s4);
|
|
+}
|
|
+
|
|
+void (*__malloc_message_1_0)(const char *s1, const char *s2, const char *s3,
|
|
+ const char *s4) = wrtmessage_1_0;
|
|
+__sym_compat(_malloc_message, __malloc_message_1_0, FBSD_1.0);
|
|
+
|
|
/*
|
|
* glibc provides a non-standard strerror_r() when _GNU_SOURCE is defined, so
|
|
* provide a wrapper.
|