1a4bd5210SJason Evansdiff --git a/doc/jemalloc.xml.in b/doc/jemalloc.xml.in 2*d0e79aa3SJason Evansindex 8fc774b..47b453c 100644 3a4bd5210SJason Evans--- a/doc/jemalloc.xml.in 4a4bd5210SJason Evans+++ b/doc/jemalloc.xml.in 5*d0e79aa3SJason Evans@@ -53,6 +53,17 @@ 6a4bd5210SJason Evans <para>This manual describes jemalloc @jemalloc_version@. More information 7a4bd5210SJason Evans can be found at the <ulink 8a4bd5210SJason Evans url="http://www.canonware.com/jemalloc/">jemalloc website</ulink>.</para> 9a4bd5210SJason Evans+ 10a4bd5210SJason Evans+ <para>The following configuration options are enabled in libc's built-in 11*d0e79aa3SJason Evans+ jemalloc: <option>--enable-fill</option>, 12a4bd5210SJason Evans+ <option>--enable-lazy-lock</option>, <option>--enable-munmap</option>, 13a4bd5210SJason Evans+ <option>--enable-stats</option>, <option>--enable-tcache</option>, 14a4bd5210SJason Evans+ <option>--enable-tls</option>, <option>--enable-utrace</option>, and 15a4bd5210SJason Evans+ <option>--enable-xmalloc</option>. Additionally, 16a4bd5210SJason Evans+ <option>--enable-debug</option> is enabled in development versions of 17a4bd5210SJason Evans+ FreeBSD (controlled by the <constant>MALLOC_PRODUCTION</constant> make 18a4bd5210SJason Evans+ variable).</para> 19*d0e79aa3SJason Evans+ 20a4bd5210SJason Evans </refsect1> 21a4bd5210SJason Evans <refsynopsisdiv> 22a4bd5210SJason Evans <title>SYNOPSIS</title> 23*d0e79aa3SJason Evans@@ -2759,4 +2770,18 @@ malloc_conf = "lg_chunk:24";]]></programlisting></para> 24a4bd5210SJason Evans <para>The <function>posix_memalign<parameter/></function> function conforms 25a4bd5210SJason Evans to IEEE Std 1003.1-2001 (“POSIX.1”).</para> 26a4bd5210SJason Evans </refsect1> 27a4bd5210SJason Evans+ <refsect1 id="history"> 28a4bd5210SJason Evans+ <title>HISTORY</title> 29a4bd5210SJason Evans+ <para>The <function>malloc_usable_size<parameter/></function> and 30a4bd5210SJason Evans+ <function>posix_memalign<parameter/></function> functions first appeared in 31a4bd5210SJason Evans+ FreeBSD 7.0.</para> 32a4bd5210SJason Evans+ 33a4bd5210SJason Evans+ <para>The <function>aligned_alloc<parameter/></function>, 34*d0e79aa3SJason Evans+ <function>malloc_stats_print<parameter/></function>, and 35*d0e79aa3SJason Evans+ <function>mallctl*<parameter/></function> functions first appeared in 36a4bd5210SJason Evans+ FreeBSD 10.0.</para> 37f921d10fSJason Evans+ 38f921d10fSJason Evans+ <para>The <function>*allocx<parameter/></function> functions first appeared 39f921d10fSJason Evans+ in FreeBSD 11.0.</para> 40a4bd5210SJason Evans+ </refsect1> 41a4bd5210SJason Evans </refentry> 42a4bd5210SJason Evansdiff --git a/include/jemalloc/internal/jemalloc_internal.h.in b/include/jemalloc/internal/jemalloc_internal.h.in 43*d0e79aa3SJason Evansindex 7a137b6..b0001e9 100644 44a4bd5210SJason Evans--- a/include/jemalloc/internal/jemalloc_internal.h.in 45a4bd5210SJason Evans+++ b/include/jemalloc/internal/jemalloc_internal.h.in 46*d0e79aa3SJason Evans@@ -8,6 +8,9 @@ 47*d0e79aa3SJason Evans #include <sys/ktrace.h> 48e722f8f8SJason Evans #endif 49a4bd5210SJason Evans 50a4bd5210SJason Evans+#include "un-namespace.h" 51a4bd5210SJason Evans+#include "libc_private.h" 52a4bd5210SJason Evans+ 53a4bd5210SJason Evans #define JEMALLOC_NO_DEMANGLE 54f921d10fSJason Evans #ifdef JEMALLOC_JET 55f921d10fSJason Evans # define JEMALLOC_N(n) jet_##n 56*d0e79aa3SJason Evans@@ -42,13 +45,7 @@ static const bool config_fill = 57edaa25bdSJason Evans false 58edaa25bdSJason Evans #endif 59edaa25bdSJason Evans ; 60edaa25bdSJason Evans-static const bool config_lazy_lock = 61edaa25bdSJason Evans-#ifdef JEMALLOC_LAZY_LOCK 62edaa25bdSJason Evans- true 63edaa25bdSJason Evans-#else 64edaa25bdSJason Evans- false 65edaa25bdSJason Evans-#endif 66edaa25bdSJason Evans- ; 67edaa25bdSJason Evans+static const bool config_lazy_lock = true; 68edaa25bdSJason Evans static const bool config_prof = 69edaa25bdSJason Evans #ifdef JEMALLOC_PROF 70edaa25bdSJason Evans true 71*d0e79aa3SJason Evansdiff --git a/include/jemalloc/internal/jemalloc_internal_decls.h b/include/jemalloc/internal/jemalloc_internal_decls.h 72*d0e79aa3SJason Evansindex a601d6e..e7094b2 100644 73*d0e79aa3SJason Evans--- a/include/jemalloc/internal/jemalloc_internal_decls.h 74*d0e79aa3SJason Evans+++ b/include/jemalloc/internal/jemalloc_internal_decls.h 75*d0e79aa3SJason Evans@@ -1,6 +1,9 @@ 76*d0e79aa3SJason Evans #ifndef JEMALLOC_INTERNAL_DECLS_H 77*d0e79aa3SJason Evans #define JEMALLOC_INTERNAL_DECLS_H 78*d0e79aa3SJason Evans 79*d0e79aa3SJason Evans+#include "libc_private.h" 80*d0e79aa3SJason Evans+#include "namespace.h" 81*d0e79aa3SJason Evans+ 82*d0e79aa3SJason Evans #include <math.h> 83*d0e79aa3SJason Evans #ifdef _WIN32 84*d0e79aa3SJason Evans # include <windows.h> 85a4bd5210SJason Evansdiff --git a/include/jemalloc/internal/mutex.h b/include/jemalloc/internal/mutex.h 86*d0e79aa3SJason Evansindex f051f29..561378f 100644 87a4bd5210SJason Evans--- a/include/jemalloc/internal/mutex.h 88a4bd5210SJason Evans+++ b/include/jemalloc/internal/mutex.h 89*d0e79aa3SJason Evans@@ -47,15 +47,13 @@ struct malloc_mutex_s { 90a4bd5210SJason Evans 91a4bd5210SJason Evans #ifdef JEMALLOC_LAZY_LOCK 92a4bd5210SJason Evans extern bool isthreaded; 93a4bd5210SJason Evans-#else 948ed34ab0SJason Evans-# undef isthreaded /* Undo private_namespace.h definition. */ 95a4bd5210SJason Evans-# define isthreaded true 96a4bd5210SJason Evans #endif 97a4bd5210SJason Evans 98a4bd5210SJason Evans bool malloc_mutex_init(malloc_mutex_t *mutex); 99*d0e79aa3SJason Evans void malloc_mutex_prefork(malloc_mutex_t *mutex); 100*d0e79aa3SJason Evans void malloc_mutex_postfork_parent(malloc_mutex_t *mutex); 101*d0e79aa3SJason Evans void malloc_mutex_postfork_child(malloc_mutex_t *mutex); 102*d0e79aa3SJason Evans+bool malloc_mutex_first_thread(void); 103*d0e79aa3SJason Evans bool mutex_boot(void); 104*d0e79aa3SJason Evans 105*d0e79aa3SJason Evans #endif /* JEMALLOC_H_EXTERNS */ 106f921d10fSJason Evansdiff --git a/include/jemalloc/internal/private_symbols.txt b/include/jemalloc/internal/private_symbols.txt 107*d0e79aa3SJason Evansindex dbf6aa7..f87dba8 100644 108f921d10fSJason Evans--- a/include/jemalloc/internal/private_symbols.txt 109f921d10fSJason Evans+++ b/include/jemalloc/internal/private_symbols.txt 110*d0e79aa3SJason Evans@@ -277,7 +277,6 @@ iralloct_realign 111f921d10fSJason Evans isalloc 112*d0e79aa3SJason Evans isdalloct 113*d0e79aa3SJason Evans isqalloc 114f921d10fSJason Evans-isthreaded 115f921d10fSJason Evans ivsalloc 116f921d10fSJason Evans ixalloc 117f921d10fSJason Evans jemalloc_postfork_child 118a4bd5210SJason Evansdiff --git a/include/jemalloc/jemalloc_FreeBSD.h b/include/jemalloc/jemalloc_FreeBSD.h 119a4bd5210SJason Evansnew file mode 100644 120*d0e79aa3SJason Evansindex 0000000..66d6da5 121a4bd5210SJason Evans--- /dev/null 122a4bd5210SJason Evans+++ b/include/jemalloc/jemalloc_FreeBSD.h 123*d0e79aa3SJason Evans@@ -0,0 +1,137 @@ 124a4bd5210SJason Evans+/* 125a4bd5210SJason Evans+ * Override settings that were generated in jemalloc_defs.h as necessary. 126a4bd5210SJason Evans+ */ 127a4bd5210SJason Evans+ 128a4bd5210SJason Evans+#undef JEMALLOC_OVERRIDE_VALLOC 129a4bd5210SJason Evans+ 130a4bd5210SJason Evans+#ifndef MALLOC_PRODUCTION 131a4bd5210SJason Evans+#define JEMALLOC_DEBUG 132a4bd5210SJason Evans+#endif 133a4bd5210SJason Evans+ 134a4bd5210SJason Evans+/* 135a4bd5210SJason Evans+ * The following are architecture-dependent, so conditionally define them for 136a4bd5210SJason Evans+ * each supported architecture. 137a4bd5210SJason Evans+ */ 138a4bd5210SJason Evans+#undef CPU_SPINWAIT 139a4bd5210SJason Evans+#undef JEMALLOC_TLS_MODEL 140a4bd5210SJason Evans+#undef STATIC_PAGE_SHIFT 141a4bd5210SJason Evans+#undef LG_SIZEOF_PTR 142a4bd5210SJason Evans+#undef LG_SIZEOF_INT 143a4bd5210SJason Evans+#undef LG_SIZEOF_LONG 144a4bd5210SJason Evans+#undef LG_SIZEOF_INTMAX_T 145a4bd5210SJason Evans+ 146a4bd5210SJason Evans+#ifdef __i386__ 147a4bd5210SJason Evans+# define LG_SIZEOF_PTR 2 148a4bd5210SJason Evans+# define CPU_SPINWAIT __asm__ volatile("pause") 149a4bd5210SJason Evans+# define JEMALLOC_TLS_MODEL __attribute__((tls_model("initial-exec"))) 150a4bd5210SJason Evans+#endif 151a4bd5210SJason Evans+#ifdef __ia64__ 152a4bd5210SJason Evans+# define LG_SIZEOF_PTR 3 153a4bd5210SJason Evans+#endif 154a4bd5210SJason Evans+#ifdef __sparc64__ 155a4bd5210SJason Evans+# define LG_SIZEOF_PTR 3 156a4bd5210SJason Evans+# define JEMALLOC_TLS_MODEL __attribute__((tls_model("initial-exec"))) 157a4bd5210SJason Evans+#endif 158a4bd5210SJason Evans+#ifdef __amd64__ 159a4bd5210SJason Evans+# define LG_SIZEOF_PTR 3 160a4bd5210SJason Evans+# define CPU_SPINWAIT __asm__ volatile("pause") 161a4bd5210SJason Evans+# define JEMALLOC_TLS_MODEL __attribute__((tls_model("initial-exec"))) 162a4bd5210SJason Evans+#endif 163a4bd5210SJason Evans+#ifdef __arm__ 164a4bd5210SJason Evans+# define LG_SIZEOF_PTR 2 165a4bd5210SJason Evans+#endif 166a4bd5210SJason Evans+#ifdef __mips__ 167e722f8f8SJason Evans+#ifdef __mips_n64 168e722f8f8SJason Evans+# define LG_SIZEOF_PTR 3 169e722f8f8SJason Evans+#else 170a4bd5210SJason Evans+# define LG_SIZEOF_PTR 2 171a4bd5210SJason Evans+#endif 172e722f8f8SJason Evans+#endif 173a4bd5210SJason Evans+#ifdef __powerpc64__ 174a4bd5210SJason Evans+# define LG_SIZEOF_PTR 3 175a4bd5210SJason Evans+#elif defined(__powerpc__) 176a4bd5210SJason Evans+# define LG_SIZEOF_PTR 2 177a4bd5210SJason Evans+#endif 178a4bd5210SJason Evans+ 179a4bd5210SJason Evans+#ifndef JEMALLOC_TLS_MODEL 180a4bd5210SJason Evans+# define JEMALLOC_TLS_MODEL /* Default. */ 181a4bd5210SJason Evans+#endif 182a4bd5210SJason Evans+ 183a4bd5210SJason Evans+#define STATIC_PAGE_SHIFT PAGE_SHIFT 184a4bd5210SJason Evans+#define LG_SIZEOF_INT 2 185a4bd5210SJason Evans+#define LG_SIZEOF_LONG LG_SIZEOF_PTR 186a4bd5210SJason Evans+#define LG_SIZEOF_INTMAX_T 3 187a4bd5210SJason Evans+ 188a4bd5210SJason Evans+/* Disable lazy-lock machinery, mangle isthreaded, and adjust its type. */ 189a4bd5210SJason Evans+#undef JEMALLOC_LAZY_LOCK 190a4bd5210SJason Evans+extern int __isthreaded; 191a4bd5210SJason Evans+#define isthreaded ((bool)__isthreaded) 192a4bd5210SJason Evans+ 193a4bd5210SJason Evans+/* Mangle. */ 194f8ca2db1SJason Evans+#undef je_malloc 195f8ca2db1SJason Evans+#undef je_calloc 196f8ca2db1SJason Evans+#undef je_realloc 197f8ca2db1SJason Evans+#undef je_free 198f8ca2db1SJason Evans+#undef je_posix_memalign 199*d0e79aa3SJason Evans+#undef je_aligned_alloc 200f8ca2db1SJason Evans+#undef je_malloc_usable_size 201f921d10fSJason Evans+#undef je_mallocx 202f921d10fSJason Evans+#undef je_rallocx 203f921d10fSJason Evans+#undef je_xallocx 204f921d10fSJason Evans+#undef je_sallocx 205f921d10fSJason Evans+#undef je_dallocx 206f921d10fSJason Evans+#undef je_nallocx 207f8ca2db1SJason Evans+#undef je_allocm 208f8ca2db1SJason Evans+#undef je_rallocm 209f8ca2db1SJason Evans+#undef je_sallocm 210f8ca2db1SJason Evans+#undef je_dallocm 211f8ca2db1SJason Evans+#undef je_nallocm 212f8ca2db1SJason Evans+#define je_malloc __malloc 213f8ca2db1SJason Evans+#define je_calloc __calloc 214f8ca2db1SJason Evans+#define je_realloc __realloc 215f8ca2db1SJason Evans+#define je_free __free 216f8ca2db1SJason Evans+#define je_posix_memalign __posix_memalign 217*d0e79aa3SJason Evans+#define je_aligned_alloc __aligned_alloc 218f8ca2db1SJason Evans+#define je_malloc_usable_size __malloc_usable_size 219f921d10fSJason Evans+#define je_mallocx __mallocx 220f921d10fSJason Evans+#define je_rallocx __rallocx 221f921d10fSJason Evans+#define je_xallocx __xallocx 222f921d10fSJason Evans+#define je_sallocx __sallocx 223f921d10fSJason Evans+#define je_dallocx __dallocx 224f921d10fSJason Evans+#define je_nallocx __nallocx 225f8ca2db1SJason Evans+#define je_allocm __allocm 226f8ca2db1SJason Evans+#define je_rallocm __rallocm 227f8ca2db1SJason Evans+#define je_sallocm __sallocm 228f8ca2db1SJason Evans+#define je_dallocm __dallocm 229f8ca2db1SJason Evans+#define je_nallocm __nallocm 230a4bd5210SJason Evans+#define open _open 231a4bd5210SJason Evans+#define read _read 232a4bd5210SJason Evans+#define write _write 233a4bd5210SJason Evans+#define close _close 234a4bd5210SJason Evans+#define pthread_mutex_lock _pthread_mutex_lock 235a4bd5210SJason Evans+#define pthread_mutex_unlock _pthread_mutex_unlock 236f8ca2db1SJason Evans+ 237f8ca2db1SJason Evans+#ifdef JEMALLOC_C_ 238f8ca2db1SJason Evans+/* 239f8ca2db1SJason Evans+ * Define 'weak' symbols so that an application can have its own versions 240f8ca2db1SJason Evans+ * of malloc, calloc, realloc, free, et al. 241f8ca2db1SJason Evans+ */ 242f8ca2db1SJason Evans+__weak_reference(__malloc, malloc); 243f8ca2db1SJason Evans+__weak_reference(__calloc, calloc); 244f8ca2db1SJason Evans+__weak_reference(__realloc, realloc); 245f8ca2db1SJason Evans+__weak_reference(__free, free); 246f8ca2db1SJason Evans+__weak_reference(__posix_memalign, posix_memalign); 247*d0e79aa3SJason Evans+__weak_reference(__aligned_alloc, aligned_alloc); 248f8ca2db1SJason Evans+__weak_reference(__malloc_usable_size, malloc_usable_size); 249f921d10fSJason Evans+__weak_reference(__mallocx, mallocx); 250f921d10fSJason Evans+__weak_reference(__rallocx, rallocx); 251f921d10fSJason Evans+__weak_reference(__xallocx, xallocx); 252f921d10fSJason Evans+__weak_reference(__sallocx, sallocx); 253f921d10fSJason Evans+__weak_reference(__dallocx, dallocx); 254f921d10fSJason Evans+__weak_reference(__nallocx, nallocx); 255f8ca2db1SJason Evans+__weak_reference(__allocm, allocm); 256f8ca2db1SJason Evans+__weak_reference(__rallocm, rallocm); 257f8ca2db1SJason Evans+__weak_reference(__sallocm, sallocm); 258f8ca2db1SJason Evans+__weak_reference(__dallocm, dallocm); 259f8ca2db1SJason Evans+__weak_reference(__nallocm, nallocm); 260f8ca2db1SJason Evans+#endif 261f921d10fSJason Evansdiff --git a/include/jemalloc/jemalloc_rename.sh b/include/jemalloc/jemalloc_rename.sh 262f921d10fSJason Evansindex f943891..47d032c 100755 263f921d10fSJason Evans--- a/include/jemalloc/jemalloc_rename.sh 264f921d10fSJason Evans+++ b/include/jemalloc/jemalloc_rename.sh 265f921d10fSJason Evans@@ -19,4 +19,6 @@ done 266f921d10fSJason Evans 267f921d10fSJason Evans cat <<EOF 268f921d10fSJason Evans #endif 269f8ca2db1SJason Evans+ 270f921d10fSJason Evans+#include "jemalloc_FreeBSD.h" 271f921d10fSJason Evans EOF 272a4bd5210SJason Evansdiff --git a/src/jemalloc.c b/src/jemalloc.c 273*d0e79aa3SJason Evansindex ed7863b..d078a1f 100644 274a4bd5210SJason Evans--- a/src/jemalloc.c 275a4bd5210SJason Evans+++ b/src/jemalloc.c 276*d0e79aa3SJason Evans@@ -4,6 +4,10 @@ 277*d0e79aa3SJason Evans /******************************************************************************/ 278*d0e79aa3SJason Evans /* Data. */ 279a4bd5210SJason Evans 280e722f8f8SJason Evans+/* Work around <http://llvm.org/bugs/show_bug.cgi?id=12623>: */ 281e722f8f8SJason Evans+const char *__malloc_options_1_0 = NULL; 282a4bd5210SJason Evans+__sym_compat(_malloc_options, __malloc_options_1_0, FBSD_1.0); 283a4bd5210SJason Evans+ 284a4bd5210SJason Evans /* Runtime configuration options. */ 285*d0e79aa3SJason Evans const char *je_malloc_conf JEMALLOC_ATTR(weak); 28688ad2f8dSJason Evans bool opt_abort = 287*d0e79aa3SJason Evans@@ -2475,6 +2479,107 @@ je_malloc_usable_size(JEMALLOC_USABLE_SIZE_CONST void *ptr) 288*d0e79aa3SJason Evans */ 289*d0e79aa3SJason Evans /******************************************************************************/ 290a4bd5210SJason Evans /* 291*d0e79aa3SJason Evans+ * Begin compatibility functions. 292*d0e79aa3SJason Evans+ */ 293*d0e79aa3SJason Evans+ 294*d0e79aa3SJason Evans+#define ALLOCM_LG_ALIGN(la) (la) 295*d0e79aa3SJason Evans+#define ALLOCM_ALIGN(a) (ffsl(a)-1) 296*d0e79aa3SJason Evans+#define ALLOCM_ZERO ((int)0x40) 297*d0e79aa3SJason Evans+#define ALLOCM_NO_MOVE ((int)0x80) 298*d0e79aa3SJason Evans+ 299*d0e79aa3SJason Evans+#define ALLOCM_SUCCESS 0 300*d0e79aa3SJason Evans+#define ALLOCM_ERR_OOM 1 301*d0e79aa3SJason Evans+#define ALLOCM_ERR_NOT_MOVED 2 302*d0e79aa3SJason Evans+ 303*d0e79aa3SJason Evans+int 304*d0e79aa3SJason Evans+je_allocm(void **ptr, size_t *rsize, size_t size, int flags) 305*d0e79aa3SJason Evans+{ 306*d0e79aa3SJason Evans+ void *p; 307*d0e79aa3SJason Evans+ 308*d0e79aa3SJason Evans+ assert(ptr != NULL); 309*d0e79aa3SJason Evans+ 310*d0e79aa3SJason Evans+ p = je_mallocx(size, flags); 311*d0e79aa3SJason Evans+ if (p == NULL) 312*d0e79aa3SJason Evans+ return (ALLOCM_ERR_OOM); 313*d0e79aa3SJason Evans+ if (rsize != NULL) 314*d0e79aa3SJason Evans+ *rsize = isalloc(p, config_prof); 315*d0e79aa3SJason Evans+ *ptr = p; 316*d0e79aa3SJason Evans+ return (ALLOCM_SUCCESS); 317*d0e79aa3SJason Evans+} 318*d0e79aa3SJason Evans+ 319*d0e79aa3SJason Evans+int 320*d0e79aa3SJason Evans+je_rallocm(void **ptr, size_t *rsize, size_t size, size_t extra, int flags) 321*d0e79aa3SJason Evans+{ 322*d0e79aa3SJason Evans+ int ret; 323*d0e79aa3SJason Evans+ bool no_move = flags & ALLOCM_NO_MOVE; 324*d0e79aa3SJason Evans+ 325*d0e79aa3SJason Evans+ assert(ptr != NULL); 326*d0e79aa3SJason Evans+ assert(*ptr != NULL); 327*d0e79aa3SJason Evans+ assert(size != 0); 328*d0e79aa3SJason Evans+ assert(SIZE_T_MAX - size >= extra); 329*d0e79aa3SJason Evans+ 330*d0e79aa3SJason Evans+ if (no_move) { 331*d0e79aa3SJason Evans+ size_t usize = je_xallocx(*ptr, size, extra, flags); 332*d0e79aa3SJason Evans+ ret = (usize >= size) ? ALLOCM_SUCCESS : ALLOCM_ERR_NOT_MOVED; 333*d0e79aa3SJason Evans+ if (rsize != NULL) 334*d0e79aa3SJason Evans+ *rsize = usize; 335*d0e79aa3SJason Evans+ } else { 336*d0e79aa3SJason Evans+ void *p = je_rallocx(*ptr, size+extra, flags); 337*d0e79aa3SJason Evans+ if (p != NULL) { 338*d0e79aa3SJason Evans+ *ptr = p; 339*d0e79aa3SJason Evans+ ret = ALLOCM_SUCCESS; 340*d0e79aa3SJason Evans+ } else 341*d0e79aa3SJason Evans+ ret = ALLOCM_ERR_OOM; 342*d0e79aa3SJason Evans+ if (rsize != NULL) 343*d0e79aa3SJason Evans+ *rsize = isalloc(*ptr, config_prof); 344*d0e79aa3SJason Evans+ } 345*d0e79aa3SJason Evans+ return (ret); 346*d0e79aa3SJason Evans+} 347*d0e79aa3SJason Evans+ 348*d0e79aa3SJason Evans+int 349*d0e79aa3SJason Evans+je_sallocm(const void *ptr, size_t *rsize, int flags) 350*d0e79aa3SJason Evans+{ 351*d0e79aa3SJason Evans+ 352*d0e79aa3SJason Evans+ assert(rsize != NULL); 353*d0e79aa3SJason Evans+ *rsize = je_sallocx(ptr, flags); 354*d0e79aa3SJason Evans+ return (ALLOCM_SUCCESS); 355*d0e79aa3SJason Evans+} 356*d0e79aa3SJason Evans+ 357*d0e79aa3SJason Evans+int 358*d0e79aa3SJason Evans+je_dallocm(void *ptr, int flags) 359*d0e79aa3SJason Evans+{ 360*d0e79aa3SJason Evans+ 361*d0e79aa3SJason Evans+ je_dallocx(ptr, flags); 362*d0e79aa3SJason Evans+ return (ALLOCM_SUCCESS); 363*d0e79aa3SJason Evans+} 364*d0e79aa3SJason Evans+ 365*d0e79aa3SJason Evans+int 366*d0e79aa3SJason Evans+je_nallocm(size_t *rsize, size_t size, int flags) 367*d0e79aa3SJason Evans+{ 368*d0e79aa3SJason Evans+ size_t usize; 369*d0e79aa3SJason Evans+ 370*d0e79aa3SJason Evans+ usize = je_nallocx(size, flags); 371*d0e79aa3SJason Evans+ if (usize == 0) 372*d0e79aa3SJason Evans+ return (ALLOCM_ERR_OOM); 373*d0e79aa3SJason Evans+ if (rsize != NULL) 374*d0e79aa3SJason Evans+ *rsize = usize; 375*d0e79aa3SJason Evans+ return (ALLOCM_SUCCESS); 376*d0e79aa3SJason Evans+} 377*d0e79aa3SJason Evans+ 378*d0e79aa3SJason Evans+#undef ALLOCM_LG_ALIGN 379*d0e79aa3SJason Evans+#undef ALLOCM_ALIGN 380*d0e79aa3SJason Evans+#undef ALLOCM_ZERO 381*d0e79aa3SJason Evans+#undef ALLOCM_NO_MOVE 382*d0e79aa3SJason Evans+ 383*d0e79aa3SJason Evans+#undef ALLOCM_SUCCESS 384*d0e79aa3SJason Evans+#undef ALLOCM_ERR_OOM 385*d0e79aa3SJason Evans+#undef ALLOCM_ERR_NOT_MOVED 386*d0e79aa3SJason Evans+ 387*d0e79aa3SJason Evans+/* 388*d0e79aa3SJason Evans+ * End compatibility functions. 389*d0e79aa3SJason Evans+ */ 390*d0e79aa3SJason Evans+/******************************************************************************/ 391*d0e79aa3SJason Evans+/* 392*d0e79aa3SJason Evans * The following functions are used by threading libraries for protection of 393*d0e79aa3SJason Evans * malloc during fork(). 394*d0e79aa3SJason Evans */ 395*d0e79aa3SJason Evans@@ -2575,4 +2680,11 @@ jemalloc_postfork_child(void) 396*d0e79aa3SJason Evans ctl_postfork_child(); 397*d0e79aa3SJason Evans } 398*d0e79aa3SJason Evans 399*d0e79aa3SJason Evans+void 400*d0e79aa3SJason Evans+_malloc_first_thread(void) 401*d0e79aa3SJason Evans+{ 402*d0e79aa3SJason Evans+ 403*d0e79aa3SJason Evans+ (void)malloc_mutex_first_thread(); 404*d0e79aa3SJason Evans+} 405*d0e79aa3SJason Evans+ 406*d0e79aa3SJason Evans /******************************************************************************/ 407a4bd5210SJason Evansdiff --git a/src/mutex.c b/src/mutex.c 408*d0e79aa3SJason Evansindex 2d47af9..934d5aa 100644 409a4bd5210SJason Evans--- a/src/mutex.c 410a4bd5210SJason Evans+++ b/src/mutex.c 411e722f8f8SJason Evans@@ -66,6 +66,17 @@ pthread_create(pthread_t *__restrict thread, 412a4bd5210SJason Evans #ifdef JEMALLOC_MUTEX_INIT_CB 41382872ac0SJason Evans JEMALLOC_EXPORT int _pthread_mutex_init_calloc_cb(pthread_mutex_t *mutex, 414a4bd5210SJason Evans void *(calloc_cb)(size_t, size_t)); 415a4bd5210SJason Evans+ 416*d0e79aa3SJason Evans+#pragma weak _pthread_mutex_init_calloc_cb 417a4bd5210SJason Evans+int 418*d0e79aa3SJason Evans+_pthread_mutex_init_calloc_cb(pthread_mutex_t *mutex, 419a4bd5210SJason Evans+ void *(calloc_cb)(size_t, size_t)) 420a4bd5210SJason Evans+{ 421a4bd5210SJason Evans+ 422*d0e79aa3SJason Evans+ return (((int (*)(pthread_mutex_t *, void *(*)(size_t, size_t))) 423*d0e79aa3SJason Evans+ __libc_interposing[INTERPOS__pthread_mutex_init_calloc_cb])(mutex, 424*d0e79aa3SJason Evans+ calloc_cb)); 425a4bd5210SJason Evans+} 426a4bd5210SJason Evans #endif 427a4bd5210SJason Evans 428a4bd5210SJason Evans bool 429*d0e79aa3SJason Evans@@ -137,7 +148,7 @@ malloc_mutex_postfork_child(malloc_mutex_t *mutex) 430*d0e79aa3SJason Evans } 431*d0e79aa3SJason Evans 432*d0e79aa3SJason Evans bool 433*d0e79aa3SJason Evans-mutex_boot(void) 434*d0e79aa3SJason Evans+malloc_mutex_first_thread(void) 435*d0e79aa3SJason Evans { 436*d0e79aa3SJason Evans 437*d0e79aa3SJason Evans #ifdef JEMALLOC_MUTEX_INIT_CB 438*d0e79aa3SJason Evans@@ -151,3 +162,14 @@ mutex_boot(void) 439*d0e79aa3SJason Evans #endif 440*d0e79aa3SJason Evans return (false); 441*d0e79aa3SJason Evans } 442*d0e79aa3SJason Evans+ 443*d0e79aa3SJason Evans+bool 444*d0e79aa3SJason Evans+mutex_boot(void) 445*d0e79aa3SJason Evans+{ 446*d0e79aa3SJason Evans+ 447*d0e79aa3SJason Evans+#ifndef JEMALLOC_MUTEX_INIT_CB 448*d0e79aa3SJason Evans+ return (malloc_mutex_first_thread()); 449*d0e79aa3SJason Evans+#else 450*d0e79aa3SJason Evans+ return (false); 451*d0e79aa3SJason Evans+#endif 452*d0e79aa3SJason Evans+} 453a4bd5210SJason Evansdiff --git a/src/util.c b/src/util.c 454*d0e79aa3SJason Evansindex 4cb0d6c..25b61c2 100644 455a4bd5210SJason Evans--- a/src/util.c 456a4bd5210SJason Evans+++ b/src/util.c 457e722f8f8SJason Evans@@ -58,6 +58,22 @@ wrtmessage(void *cbopaque, const char *s) 458a4bd5210SJason Evans 459e722f8f8SJason Evans JEMALLOC_EXPORT void (*je_malloc_message)(void *, const char *s); 460e722f8f8SJason Evans 461e722f8f8SJason Evans+JEMALLOC_ATTR(visibility("hidden")) 462a4bd5210SJason Evans+void 463a4bd5210SJason Evans+wrtmessage_1_0(const char *s1, const char *s2, const char *s3, 464a4bd5210SJason Evans+ const char *s4) 465a4bd5210SJason Evans+{ 466a4bd5210SJason Evans+ 467a4bd5210SJason Evans+ wrtmessage(NULL, s1); 468a4bd5210SJason Evans+ wrtmessage(NULL, s2); 469a4bd5210SJason Evans+ wrtmessage(NULL, s3); 470a4bd5210SJason Evans+ wrtmessage(NULL, s4); 471a4bd5210SJason Evans+} 472a4bd5210SJason Evans+ 473a4bd5210SJason Evans+void (*__malloc_message_1_0)(const char *s1, const char *s2, const char *s3, 474a4bd5210SJason Evans+ const char *s4) = wrtmessage_1_0; 475a4bd5210SJason Evans+__sym_compat(_malloc_message, __malloc_message_1_0, FBSD_1.0); 476a4bd5210SJason Evans+ 477a4bd5210SJason Evans /* 478e722f8f8SJason Evans * Wrapper around malloc_message() that avoids the need for 479e722f8f8SJason Evans * je_malloc_message(...) throughout the code. 480