1a4bd5210SJason Evansdiff --git a/doc/jemalloc.xml.in b/doc/jemalloc.xml.in 2c5ad8142SEric van Gyzenindex 7fecda7c..d5ca5e86 100644 3a4bd5210SJason Evans--- a/doc/jemalloc.xml.in 4a4bd5210SJason Evans+++ b/doc/jemalloc.xml.in 51a78ec89SJason 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>, 131a78ec89SJason Evans+ <option>--enable-utrace</option>, <option>--enable-xmalloc</option>, and 141a78ec89SJason 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 17*7d4374f6SDimitry Andric+ <constant>MK_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 <<filename class="headerfile">jemalloc/jemalloc.h</filename>></funcsynopsisinfo> 24c13244b9SJason Evans+ <funcsynopsisinfo>#include <<filename class="headerfile">stdlib.h</filename>> 25c13244b9SJason Evans+#include <<filename class="headerfile">malloc_np.h</filename>></funcsynopsisinfo> 26c13244b9SJason Evans <refsect2> 27c13244b9SJason Evans <title>Standard API</title> 28c13244b9SJason Evans <funcprototype> 29c5ad8142SEric van Gyzen@@ -3510,4 +3521,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/jemalloc_internal_decls.h b/include/jemalloc/internal/jemalloc_internal_decls.h 49c5ad8142SEric van Gyzenindex 7d6053e2..a0e4f5af 100644 50b7eaed25SJason Evans--- a/include/jemalloc/internal/jemalloc_internal_decls.h 51b7eaed25SJason Evans+++ b/include/jemalloc/internal/jemalloc_internal_decls.h 52b7eaed25SJason Evans@@ -1,6 +1,9 @@ 53b7eaed25SJason Evans #ifndef JEMALLOC_INTERNAL_DECLS_H 54b7eaed25SJason Evans #define JEMALLOC_INTERNAL_DECLS_H 55fbb1d85eSJason Evans 56b7eaed25SJason Evans+#include "libc_private.h" 57b7eaed25SJason Evans+#include "namespace.h" 58b7eaed25SJason Evans+ 59b7eaed25SJason Evans #include <math.h> 60b7eaed25SJason Evans #ifdef _WIN32 61b7eaed25SJason Evans # include <windows.h> 62c5ad8142SEric van Gyzendiff --git a/include/jemalloc/internal/jemalloc_internal_defs_FreeBSD.h b/include/jemalloc/internal/jemalloc_internal_defs_FreeBSD.h 63c5ad8142SEric van Gyzennew file mode 100644 64c5ad8142SEric van Gyzenindex 00000000..0dab1296 65c5ad8142SEric van Gyzen--- /dev/null 66c5ad8142SEric van Gyzen+++ b/include/jemalloc/internal/jemalloc_internal_defs_FreeBSD.h 67c5ad8142SEric van Gyzen@@ -0,0 +1,9 @@ 68c5ad8142SEric van Gyzen+#ifndef __clang__ 69c5ad8142SEric van Gyzen+# undef JEMALLOC_INTERNAL_UNREACHABLE 70c5ad8142SEric van Gyzen+# define JEMALLOC_INTERNAL_UNREACHABLE abort 71c5ad8142SEric van Gyzen+ 72c5ad8142SEric van Gyzen+# undef JEMALLOC_C11_ATOMICS 73c5ad8142SEric van Gyzen+# undef JEMALLOC_GCC_ATOMIC_ATOMICS 74c5ad8142SEric van Gyzen+# undef JEMALLOC_GCC_U8_ATOMIC_ATOMICS 75c5ad8142SEric van Gyzen+# undef JEMALLOC_GCC_U8_SYNC_ATOMICS 76c5ad8142SEric van Gyzen+#endif 77b7eaed25SJason Evansdiff --git a/include/jemalloc/internal/jemalloc_preamble.h.in b/include/jemalloc/internal/jemalloc_preamble.h.in 78c5ad8142SEric van Gyzenindex 3418cbfa..53e30dc4 100644 79b7eaed25SJason Evans--- a/include/jemalloc/internal/jemalloc_preamble.h.in 80b7eaed25SJason Evans+++ b/include/jemalloc/internal/jemalloc_preamble.h.in 81d0e79aa3SJason Evans@@ -8,6 +8,9 @@ 82d0e79aa3SJason Evans #include <sys/ktrace.h> 83e722f8f8SJason Evans #endif 84a4bd5210SJason Evans 85a4bd5210SJason Evans+#include "un-namespace.h" 86a4bd5210SJason Evans+#include "libc_private.h" 87a4bd5210SJason Evans+ 88a4bd5210SJason Evans #define JEMALLOC_NO_DEMANGLE 89f921d10fSJason Evans #ifdef JEMALLOC_JET 90b7eaed25SJason Evans # undef JEMALLOC_IS_MALLOC 910ef50b4eSJason Evans@@ -79,13 +82,7 @@ static const bool config_fill = 92edaa25bdSJason Evans false 93edaa25bdSJason Evans #endif 94edaa25bdSJason Evans ; 95edaa25bdSJason Evans-static const bool config_lazy_lock = 96edaa25bdSJason Evans-#ifdef JEMALLOC_LAZY_LOCK 97edaa25bdSJason Evans- true 98edaa25bdSJason Evans-#else 99edaa25bdSJason Evans- false 100edaa25bdSJason Evans-#endif 101edaa25bdSJason Evans- ; 102edaa25bdSJason Evans+static const bool config_lazy_lock = true; 103df0d881dSJason Evans static const char * const config_malloc_conf = JEMALLOC_CONFIG_MALLOC_CONF; 104edaa25bdSJason Evans static const bool config_prof = 105edaa25bdSJason Evans #ifdef JEMALLOC_PROF 106a4bd5210SJason Evansdiff --git a/include/jemalloc/internal/mutex.h b/include/jemalloc/internal/mutex.h 107c5ad8142SEric van Gyzenindex 7c24f072..94af1618 100644 108a4bd5210SJason Evans--- a/include/jemalloc/internal/mutex.h 109a4bd5210SJason Evans+++ b/include/jemalloc/internal/mutex.h 110c5ad8142SEric van Gyzen@@ -135,9 +135,6 @@ struct malloc_mutex_s { 111a4bd5210SJason Evans 112a4bd5210SJason Evans #ifdef JEMALLOC_LAZY_LOCK 113a4bd5210SJason Evans extern bool isthreaded; 114a4bd5210SJason Evans-#else 1158ed34ab0SJason Evans-# undef isthreaded /* Undo private_namespace.h definition. */ 116a4bd5210SJason Evans-# define isthreaded true 117a4bd5210SJason Evans #endif 118a4bd5210SJason Evans 1191f0a49e8SJason Evans bool malloc_mutex_init(malloc_mutex_t *mutex, const char *name, 120c5ad8142SEric van Gyzen@@ -145,6 +142,7 @@ bool malloc_mutex_init(malloc_mutex_t *mutex, const char *name, 1211f0a49e8SJason Evans void malloc_mutex_prefork(tsdn_t *tsdn, malloc_mutex_t *mutex); 1221f0a49e8SJason Evans void malloc_mutex_postfork_parent(tsdn_t *tsdn, malloc_mutex_t *mutex); 1231f0a49e8SJason Evans void malloc_mutex_postfork_child(tsdn_t *tsdn, malloc_mutex_t *mutex); 124d0e79aa3SJason Evans+bool malloc_mutex_first_thread(void); 1251f0a49e8SJason Evans bool malloc_mutex_boot(void); 126b7eaed25SJason Evans void malloc_mutex_prof_data_reset(tsdn_t *tsdn, malloc_mutex_t *mutex); 127d0e79aa3SJason Evans 128c5ad8142SEric van Gyzendiff --git a/include/jemalloc/internal/test_hooks.h b/include/jemalloc/internal/test_hooks.h 129c5ad8142SEric van Gyzenindex a6351e59..0780c52f 100644 130c5ad8142SEric van Gyzen--- a/include/jemalloc/internal/test_hooks.h 131c5ad8142SEric van Gyzen+++ b/include/jemalloc/internal/test_hooks.h 132c5ad8142SEric van Gyzen@@ -6,13 +6,6 @@ extern JEMALLOC_EXPORT void (*test_hooks_libc_hook)(); 133c5ad8142SEric van Gyzen 134c5ad8142SEric van Gyzen #define JEMALLOC_HOOK(fn, hook) ((void)(hook != NULL && (hook(), 0)), fn) 135c5ad8142SEric van Gyzen 136c5ad8142SEric van Gyzen-#define open JEMALLOC_HOOK(open, test_hooks_libc_hook) 137c5ad8142SEric van Gyzen-#define read JEMALLOC_HOOK(read, test_hooks_libc_hook) 138c5ad8142SEric van Gyzen-#define write JEMALLOC_HOOK(write, test_hooks_libc_hook) 139c5ad8142SEric van Gyzen-#define readlink JEMALLOC_HOOK(readlink, test_hooks_libc_hook) 140c5ad8142SEric van Gyzen-#define close JEMALLOC_HOOK(close, test_hooks_libc_hook) 141c5ad8142SEric van Gyzen-#define creat JEMALLOC_HOOK(creat, test_hooks_libc_hook) 142c5ad8142SEric van Gyzen-#define secure_getenv JEMALLOC_HOOK(secure_getenv, test_hooks_libc_hook) 143c5ad8142SEric van Gyzen /* Note that this is undef'd and re-define'd in src/prof.c. */ 144c5ad8142SEric van Gyzen #define _Unwind_Backtrace JEMALLOC_HOOK(_Unwind_Backtrace, test_hooks_libc_hook) 145c5ad8142SEric van Gyzen 1460ef50b4eSJason Evansdiff --git a/include/jemalloc/internal/tsd.h b/include/jemalloc/internal/tsd.h 147c5ad8142SEric van Gyzenindex 9ba26004..ecfda5d6 100644 1480ef50b4eSJason Evans--- a/include/jemalloc/internal/tsd.h 1490ef50b4eSJason Evans+++ b/include/jemalloc/internal/tsd.h 150c5ad8142SEric van Gyzen@@ -198,7 +198,8 @@ struct tsd_s { 151c5ad8142SEric van Gyzen t TSD_MANGLE(n); 1520ef50b4eSJason Evans MALLOC_TSD 1530ef50b4eSJason Evans #undef O 1540ef50b4eSJason Evans-}; 1550ef50b4eSJason Evans+/* AddressSanitizer requires TLS data to be aligned to at least 8 bytes. */ 1560ef50b4eSJason Evans+} JEMALLOC_ALIGNED(16); 1570ef50b4eSJason Evans 158c5ad8142SEric van Gyzen JEMALLOC_ALWAYS_INLINE uint8_t 159c5ad8142SEric van Gyzen tsd_state_get(tsd_t *tsd) { 160a4bd5210SJason Evansdiff --git a/include/jemalloc/jemalloc_FreeBSD.h b/include/jemalloc/jemalloc_FreeBSD.h 161a4bd5210SJason Evansnew file mode 100644 1620ef50b4eSJason Evansindex 00000000..b752b0e7 163a4bd5210SJason Evans--- /dev/null 164a4bd5210SJason Evans+++ b/include/jemalloc/jemalloc_FreeBSD.h 165b7eaed25SJason Evans@@ -0,0 +1,185 @@ 166a4bd5210SJason Evans+/* 167a4bd5210SJason Evans+ * Override settings that were generated in jemalloc_defs.h as necessary. 168a4bd5210SJason Evans+ */ 169a4bd5210SJason Evans+ 170a4bd5210SJason Evans+#undef JEMALLOC_OVERRIDE_VALLOC 171a4bd5210SJason Evans+ 172a4bd5210SJason Evans+#ifndef MALLOC_PRODUCTION 173a4bd5210SJason Evans+#define JEMALLOC_DEBUG 174a4bd5210SJason Evans+#endif 175a4bd5210SJason Evans+ 1761f0a49e8SJason Evans+#undef JEMALLOC_DSS 1771f0a49e8SJason Evans+ 178b7eaed25SJason Evans+#undef JEMALLOC_BACKGROUND_THREAD 179b7eaed25SJason Evans+ 180a4bd5210SJason Evans+/* 181a4bd5210SJason Evans+ * The following are architecture-dependent, so conditionally define them for 182a4bd5210SJason Evans+ * each supported architecture. 183a4bd5210SJason Evans+ */ 184a4bd5210SJason Evans+#undef JEMALLOC_TLS_MODEL 185c2a2eeffSMarius Strobl+#undef LG_PAGE 186b7eaed25SJason Evans+#undef LG_VADDR 187a4bd5210SJason Evans+#undef LG_SIZEOF_PTR 188a4bd5210SJason Evans+#undef LG_SIZEOF_INT 189a4bd5210SJason Evans+#undef LG_SIZEOF_LONG 190a4bd5210SJason Evans+#undef LG_SIZEOF_INTMAX_T 191a4bd5210SJason Evans+ 192a4bd5210SJason Evans+#ifdef __i386__ 193b7eaed25SJason Evans+# define LG_VADDR 32 194a4bd5210SJason Evans+# define LG_SIZEOF_PTR 2 195a4bd5210SJason Evans+# define JEMALLOC_TLS_MODEL __attribute__((tls_model("initial-exec"))) 196a4bd5210SJason Evans+#endif 197a4bd5210SJason Evans+#ifdef __ia64__ 198b7eaed25SJason Evans+# define LG_VADDR 64 199a4bd5210SJason Evans+# define LG_SIZEOF_PTR 3 200a4bd5210SJason Evans+#endif 201a4bd5210SJason Evans+#ifdef __sparc64__ 202b7eaed25SJason Evans+# define LG_VADDR 64 203a4bd5210SJason Evans+# define LG_SIZEOF_PTR 3 204a4bd5210SJason Evans+# define JEMALLOC_TLS_MODEL __attribute__((tls_model("initial-exec"))) 205a4bd5210SJason Evans+#endif 206a4bd5210SJason Evans+#ifdef __amd64__ 207b7eaed25SJason Evans+# define LG_VADDR 48 208a4bd5210SJason Evans+# define LG_SIZEOF_PTR 3 209a4bd5210SJason Evans+# define JEMALLOC_TLS_MODEL __attribute__((tls_model("initial-exec"))) 210a4bd5210SJason Evans+#endif 211a4bd5210SJason Evans+#ifdef __arm__ 212b7eaed25SJason Evans+# define LG_VADDR 32 213a4bd5210SJason Evans+# define LG_SIZEOF_PTR 2 214a4bd5210SJason Evans+#endif 215d8e39d2dSJason Evans+#ifdef __aarch64__ 216b7eaed25SJason Evans+# define LG_VADDR 48 217d8e39d2dSJason Evans+# define LG_SIZEOF_PTR 3 218d8e39d2dSJason Evans+#endif 219a4bd5210SJason Evans+#ifdef __mips__ 220e722f8f8SJason Evans+#ifdef __mips_n64 221b7eaed25SJason Evans+# define LG_VADDR 64 222e722f8f8SJason Evans+# define LG_SIZEOF_PTR 3 223e722f8f8SJason Evans+#else 224b7eaed25SJason Evans+# define LG_VADDR 32 225a4bd5210SJason Evans+# define LG_SIZEOF_PTR 2 226a4bd5210SJason Evans+#endif 227e722f8f8SJason Evans+#endif 228a4bd5210SJason Evans+#ifdef __powerpc64__ 229b7eaed25SJason Evans+# define LG_VADDR 64 230a4bd5210SJason Evans+# define LG_SIZEOF_PTR 3 231a4bd5210SJason Evans+#elif defined(__powerpc__) 232b7eaed25SJason Evans+# define LG_VADDR 32 233a4bd5210SJason Evans+# define LG_SIZEOF_PTR 2 234a4bd5210SJason Evans+#endif 2350ef50b4eSJason Evans+#ifdef __riscv 236ea69bf7fSBrooks Davis+# define LG_VADDR 48 237df0d881dSJason Evans+# define LG_SIZEOF_PTR 3 238df0d881dSJason Evans+#endif 239a4bd5210SJason Evans+ 240a4bd5210SJason Evans+#ifndef JEMALLOC_TLS_MODEL 241a4bd5210SJason Evans+# define JEMALLOC_TLS_MODEL /* Default. */ 242a4bd5210SJason Evans+#endif 243a4bd5210SJason Evans+ 244c2a2eeffSMarius Strobl+#define LG_PAGE PAGE_SHIFT 245a4bd5210SJason Evans+#define LG_SIZEOF_INT 2 246a4bd5210SJason Evans+#define LG_SIZEOF_LONG LG_SIZEOF_PTR 247a4bd5210SJason Evans+#define LG_SIZEOF_INTMAX_T 3 248a4bd5210SJason Evans+ 249337776f8SJason Evans+#undef CPU_SPINWAIT 250337776f8SJason Evans+#include <machine/cpu.h> 251337776f8SJason Evans+#include <machine/cpufunc.h> 252337776f8SJason Evans+#define CPU_SPINWAIT cpu_spinwait() 253337776f8SJason Evans+ 254a4bd5210SJason Evans+/* Disable lazy-lock machinery, mangle isthreaded, and adjust its type. */ 255a4bd5210SJason Evans+#undef JEMALLOC_LAZY_LOCK 256a4bd5210SJason Evans+extern int __isthreaded; 257a4bd5210SJason Evans+#define isthreaded ((bool)__isthreaded) 258a4bd5210SJason Evans+ 259a4bd5210SJason Evans+/* Mangle. */ 260f8ca2db1SJason Evans+#undef je_malloc 261f8ca2db1SJason Evans+#undef je_calloc 262f8ca2db1SJason Evans+#undef je_posix_memalign 263d0e79aa3SJason Evans+#undef je_aligned_alloc 264df0d881dSJason Evans+#undef je_realloc 265df0d881dSJason Evans+#undef je_free 266f8ca2db1SJason Evans+#undef je_malloc_usable_size 267f921d10fSJason Evans+#undef je_mallocx 268f921d10fSJason Evans+#undef je_rallocx 269f921d10fSJason Evans+#undef je_xallocx 270f921d10fSJason Evans+#undef je_sallocx 271f921d10fSJason Evans+#undef je_dallocx 272df0d881dSJason Evans+#undef je_sdallocx 273f921d10fSJason Evans+#undef je_nallocx 274df0d881dSJason Evans+#undef je_mallctl 275df0d881dSJason Evans+#undef je_mallctlnametomib 276df0d881dSJason Evans+#undef je_mallctlbymib 277df0d881dSJason Evans+#undef je_malloc_stats_print 278f8ca2db1SJason Evans+#undef je_allocm 279f8ca2db1SJason Evans+#undef je_rallocm 280f8ca2db1SJason Evans+#undef je_sallocm 281f8ca2db1SJason Evans+#undef je_dallocm 282f8ca2db1SJason Evans+#undef je_nallocm 283f8ca2db1SJason Evans+#define je_malloc __malloc 284f8ca2db1SJason Evans+#define je_calloc __calloc 285f8ca2db1SJason Evans+#define je_posix_memalign __posix_memalign 286d0e79aa3SJason Evans+#define je_aligned_alloc __aligned_alloc 287df0d881dSJason Evans+#define je_realloc __realloc 288df0d881dSJason Evans+#define je_free __free 289f8ca2db1SJason Evans+#define je_malloc_usable_size __malloc_usable_size 290f921d10fSJason Evans+#define je_mallocx __mallocx 291f921d10fSJason Evans+#define je_rallocx __rallocx 292f921d10fSJason Evans+#define je_xallocx __xallocx 293f921d10fSJason Evans+#define je_sallocx __sallocx 294f921d10fSJason Evans+#define je_dallocx __dallocx 295df0d881dSJason Evans+#define je_sdallocx __sdallocx 296f921d10fSJason Evans+#define je_nallocx __nallocx 297df0d881dSJason Evans+#define je_mallctl __mallctl 298df0d881dSJason Evans+#define je_mallctlnametomib __mallctlnametomib 299df0d881dSJason Evans+#define je_mallctlbymib __mallctlbymib 300df0d881dSJason Evans+#define je_malloc_stats_print __malloc_stats_print 301f8ca2db1SJason Evans+#define je_allocm __allocm 302f8ca2db1SJason Evans+#define je_rallocm __rallocm 303f8ca2db1SJason Evans+#define je_sallocm __sallocm 304f8ca2db1SJason Evans+#define je_dallocm __dallocm 305f8ca2db1SJason Evans+#define je_nallocm __nallocm 306a4bd5210SJason Evans+#define open _open 307a4bd5210SJason Evans+#define read _read 308a4bd5210SJason Evans+#define write _write 309a4bd5210SJason Evans+#define close _close 310b7eaed25SJason Evans+#define pthread_join _pthread_join 311b7eaed25SJason Evans+#define pthread_once _pthread_once 312b7eaed25SJason Evans+#define pthread_self _pthread_self 313b7eaed25SJason Evans+#define pthread_equal _pthread_equal 314a4bd5210SJason Evans+#define pthread_mutex_lock _pthread_mutex_lock 315b7eaed25SJason Evans+#define pthread_mutex_trylock _pthread_mutex_trylock 316a4bd5210SJason Evans+#define pthread_mutex_unlock _pthread_mutex_unlock 317b7eaed25SJason Evans+#define pthread_cond_init _pthread_cond_init 318b7eaed25SJason Evans+#define pthread_cond_wait _pthread_cond_wait 319b7eaed25SJason Evans+#define pthread_cond_timedwait _pthread_cond_timedwait 320b7eaed25SJason Evans+#define pthread_cond_signal _pthread_cond_signal 321f8ca2db1SJason Evans+ 322f8ca2db1SJason Evans+#ifdef JEMALLOC_C_ 323f8ca2db1SJason Evans+/* 324f8ca2db1SJason Evans+ * Define 'weak' symbols so that an application can have its own versions 325f8ca2db1SJason Evans+ * of malloc, calloc, realloc, free, et al. 326f8ca2db1SJason Evans+ */ 327f8ca2db1SJason Evans+__weak_reference(__malloc, malloc); 328f8ca2db1SJason Evans+__weak_reference(__calloc, calloc); 329f8ca2db1SJason Evans+__weak_reference(__posix_memalign, posix_memalign); 330d0e79aa3SJason Evans+__weak_reference(__aligned_alloc, aligned_alloc); 331df0d881dSJason Evans+__weak_reference(__realloc, realloc); 332df0d881dSJason Evans+__weak_reference(__free, free); 333f8ca2db1SJason Evans+__weak_reference(__malloc_usable_size, malloc_usable_size); 334f921d10fSJason Evans+__weak_reference(__mallocx, mallocx); 335f921d10fSJason Evans+__weak_reference(__rallocx, rallocx); 336f921d10fSJason Evans+__weak_reference(__xallocx, xallocx); 337f921d10fSJason Evans+__weak_reference(__sallocx, sallocx); 338f921d10fSJason Evans+__weak_reference(__dallocx, dallocx); 339df0d881dSJason Evans+__weak_reference(__sdallocx, sdallocx); 340f921d10fSJason Evans+__weak_reference(__nallocx, nallocx); 341df0d881dSJason Evans+__weak_reference(__mallctl, mallctl); 342df0d881dSJason Evans+__weak_reference(__mallctlnametomib, mallctlnametomib); 343df0d881dSJason Evans+__weak_reference(__mallctlbymib, mallctlbymib); 344df0d881dSJason Evans+__weak_reference(__malloc_stats_print, malloc_stats_print); 345f8ca2db1SJason Evans+__weak_reference(__allocm, allocm); 346f8ca2db1SJason Evans+__weak_reference(__rallocm, rallocm); 347f8ca2db1SJason Evans+__weak_reference(__sallocm, sallocm); 348f8ca2db1SJason Evans+__weak_reference(__dallocm, dallocm); 349f8ca2db1SJason Evans+__weak_reference(__nallocm, nallocm); 350f8ca2db1SJason Evans+#endif 351f921d10fSJason Evansdiff --git a/include/jemalloc/jemalloc_rename.sh b/include/jemalloc/jemalloc_rename.sh 352b7eaed25SJason Evansindex f9438912..47d032c1 100755 353f921d10fSJason Evans--- a/include/jemalloc/jemalloc_rename.sh 354f921d10fSJason Evans+++ b/include/jemalloc/jemalloc_rename.sh 355f921d10fSJason Evans@@ -19,4 +19,6 @@ done 356f921d10fSJason Evans 357f921d10fSJason Evans cat <<EOF 358f921d10fSJason Evans #endif 359f8ca2db1SJason Evans+ 360f921d10fSJason Evans+#include "jemalloc_FreeBSD.h" 361f921d10fSJason Evans EOF 362a4bd5210SJason Evansdiff --git a/src/jemalloc.c b/src/jemalloc.c 363c5ad8142SEric van Gyzenindex ed13718d..fefb719a 100644 364a4bd5210SJason Evans--- a/src/jemalloc.c 365a4bd5210SJason Evans+++ b/src/jemalloc.c 366c5ad8142SEric van Gyzen@@ -23,6 +23,10 @@ 367d0e79aa3SJason Evans /******************************************************************************/ 368d0e79aa3SJason Evans /* Data. */ 369a4bd5210SJason Evans 370e722f8f8SJason Evans+/* Work around <http://llvm.org/bugs/show_bug.cgi?id=12623>: */ 371e722f8f8SJason Evans+const char *__malloc_options_1_0 = NULL; 372a4bd5210SJason Evans+__sym_compat(_malloc_options, __malloc_options_1_0, FBSD_1.0); 373a4bd5210SJason Evans+ 374a4bd5210SJason Evans /* Runtime configuration options. */ 375bde95144SJason Evans const char *je_malloc_conf 376bde95144SJason Evans #ifndef _WIN32 377c5ad8142SEric van Gyzen@@ -2660,25 +2664,6 @@ je_realloc(void *ptr, size_t arg_size) { 378c5ad8142SEric van Gyzen LOG("core.realloc.entry", "ptr: %p, size: %zu\n", ptr, size); 379c5ad8142SEric van Gyzen 380c5ad8142SEric van Gyzen if (unlikely(size == 0)) { 381c5ad8142SEric van Gyzen- if (ptr != NULL) { 382c5ad8142SEric van Gyzen- /* realloc(ptr, 0) is equivalent to free(ptr). */ 383c5ad8142SEric van Gyzen- UTRACE(ptr, 0, 0); 384c5ad8142SEric van Gyzen- tcache_t *tcache; 385c5ad8142SEric van Gyzen- tsd_t *tsd = tsd_fetch(); 386c5ad8142SEric van Gyzen- if (tsd_reentrancy_level_get(tsd) == 0) { 387c5ad8142SEric van Gyzen- tcache = tcache_get(tsd); 388c5ad8142SEric van Gyzen- } else { 389c5ad8142SEric van Gyzen- tcache = NULL; 390c5ad8142SEric van Gyzen- } 391c5ad8142SEric van Gyzen- 392c5ad8142SEric van Gyzen- uintptr_t args[3] = {(uintptr_t)ptr, size}; 393c5ad8142SEric van Gyzen- hook_invoke_dalloc(hook_dalloc_realloc, ptr, args); 394c5ad8142SEric van Gyzen- 395c5ad8142SEric van Gyzen- ifree(tsd, ptr, tcache, true); 396c5ad8142SEric van Gyzen- 397c5ad8142SEric van Gyzen- LOG("core.realloc.exit", "result: %p", NULL); 398c5ad8142SEric van Gyzen- return NULL; 399c5ad8142SEric van Gyzen- } 400c5ad8142SEric van Gyzen size = 1; 401c5ad8142SEric van Gyzen } 402c5ad8142SEric van Gyzen 403c5ad8142SEric van Gyzen@@ -3750,6 +3735,103 @@ je_malloc_usable_size(JEMALLOC_USABLE_SIZE_CONST void *ptr) { 404c5ad8142SEric van Gyzen * End non-standard functions. 405d0e79aa3SJason Evans */ 406d0e79aa3SJason Evans /******************************************************************************/ 407c5ad8142SEric van Gyzen+/* 408d0e79aa3SJason Evans+ * Begin compatibility functions. 409d0e79aa3SJason Evans+ */ 410d0e79aa3SJason Evans+ 411d0e79aa3SJason Evans+#define ALLOCM_LG_ALIGN(la) (la) 412d0e79aa3SJason Evans+#define ALLOCM_ALIGN(a) (ffsl(a)-1) 413d0e79aa3SJason Evans+#define ALLOCM_ZERO ((int)0x40) 414d0e79aa3SJason Evans+#define ALLOCM_NO_MOVE ((int)0x80) 415d0e79aa3SJason Evans+ 416d0e79aa3SJason Evans+#define ALLOCM_SUCCESS 0 417d0e79aa3SJason Evans+#define ALLOCM_ERR_OOM 1 418d0e79aa3SJason Evans+#define ALLOCM_ERR_NOT_MOVED 2 419d0e79aa3SJason Evans+ 420d0e79aa3SJason Evans+int 421b7eaed25SJason Evans+je_allocm(void **ptr, size_t *rsize, size_t size, int flags) { 422d0e79aa3SJason Evans+ assert(ptr != NULL); 423d0e79aa3SJason Evans+ 424b7eaed25SJason Evans+ void *p = je_mallocx(size, flags); 425b7eaed25SJason Evans+ if (p == NULL) { 426d0e79aa3SJason Evans+ return (ALLOCM_ERR_OOM); 427b7eaed25SJason Evans+ } 428b7eaed25SJason Evans+ if (rsize != NULL) { 429b7eaed25SJason Evans+ *rsize = isalloc(tsdn_fetch(), p); 430b7eaed25SJason Evans+ } 431d0e79aa3SJason Evans+ *ptr = p; 432b7eaed25SJason Evans+ return ALLOCM_SUCCESS; 433d0e79aa3SJason Evans+} 434d0e79aa3SJason Evans+ 435d0e79aa3SJason Evans+int 436b7eaed25SJason Evans+je_rallocm(void **ptr, size_t *rsize, size_t size, size_t extra, int flags) { 437d0e79aa3SJason Evans+ assert(ptr != NULL); 438d0e79aa3SJason Evans+ assert(*ptr != NULL); 439d0e79aa3SJason Evans+ assert(size != 0); 440d0e79aa3SJason Evans+ assert(SIZE_T_MAX - size >= extra); 441d0e79aa3SJason Evans+ 442b7eaed25SJason Evans+ int ret; 443b7eaed25SJason Evans+ bool no_move = flags & ALLOCM_NO_MOVE; 444b7eaed25SJason Evans+ 445d0e79aa3SJason Evans+ if (no_move) { 446d0e79aa3SJason Evans+ size_t usize = je_xallocx(*ptr, size, extra, flags); 447d0e79aa3SJason Evans+ ret = (usize >= size) ? ALLOCM_SUCCESS : ALLOCM_ERR_NOT_MOVED; 448b7eaed25SJason Evans+ if (rsize != NULL) { 449d0e79aa3SJason Evans+ *rsize = usize; 450b7eaed25SJason Evans+ } 451d0e79aa3SJason Evans+ } else { 452d0e79aa3SJason Evans+ void *p = je_rallocx(*ptr, size+extra, flags); 453d0e79aa3SJason Evans+ if (p != NULL) { 454d0e79aa3SJason Evans+ *ptr = p; 455d0e79aa3SJason Evans+ ret = ALLOCM_SUCCESS; 456b7eaed25SJason Evans+ } else { 457d0e79aa3SJason Evans+ ret = ALLOCM_ERR_OOM; 458d0e79aa3SJason Evans+ } 459b7eaed25SJason Evans+ if (rsize != NULL) { 460b7eaed25SJason Evans+ *rsize = isalloc(tsdn_fetch(), *ptr); 461b7eaed25SJason Evans+ } 462b7eaed25SJason Evans+ } 463b7eaed25SJason Evans+ return ret; 464d0e79aa3SJason Evans+} 465d0e79aa3SJason Evans+ 466d0e79aa3SJason Evans+int 467b7eaed25SJason Evans+je_sallocm(const void *ptr, size_t *rsize, int flags) { 468d0e79aa3SJason Evans+ assert(rsize != NULL); 469d0e79aa3SJason Evans+ *rsize = je_sallocx(ptr, flags); 470b7eaed25SJason Evans+ return ALLOCM_SUCCESS; 471d0e79aa3SJason Evans+} 472d0e79aa3SJason Evans+ 473d0e79aa3SJason Evans+int 474b7eaed25SJason Evans+je_dallocm(void *ptr, int flags) { 475d0e79aa3SJason Evans+ je_dallocx(ptr, flags); 476b7eaed25SJason Evans+ return ALLOCM_SUCCESS; 477d0e79aa3SJason Evans+} 478d0e79aa3SJason Evans+ 479d0e79aa3SJason Evans+int 480b7eaed25SJason Evans+je_nallocm(size_t *rsize, size_t size, int flags) { 481b7eaed25SJason Evans+ size_t usize = je_nallocx(size, flags); 482b7eaed25SJason Evans+ if (usize == 0) { 483b7eaed25SJason Evans+ return ALLOCM_ERR_OOM; 484b7eaed25SJason Evans+ } 485b7eaed25SJason Evans+ if (rsize != NULL) { 486d0e79aa3SJason Evans+ *rsize = usize; 487b7eaed25SJason Evans+ } 488b7eaed25SJason Evans+ return ALLOCM_SUCCESS; 489d0e79aa3SJason Evans+} 490d0e79aa3SJason Evans+ 491d0e79aa3SJason Evans+#undef ALLOCM_LG_ALIGN 492d0e79aa3SJason Evans+#undef ALLOCM_ALIGN 493d0e79aa3SJason Evans+#undef ALLOCM_ZERO 494d0e79aa3SJason Evans+#undef ALLOCM_NO_MOVE 495d0e79aa3SJason Evans+ 496d0e79aa3SJason Evans+#undef ALLOCM_SUCCESS 497d0e79aa3SJason Evans+#undef ALLOCM_ERR_OOM 498d0e79aa3SJason Evans+#undef ALLOCM_ERR_NOT_MOVED 499d0e79aa3SJason Evans+ 500d0e79aa3SJason Evans+/* 501d0e79aa3SJason Evans+ * End compatibility functions. 502d0e79aa3SJason Evans+ */ 503d0e79aa3SJason Evans+/******************************************************************************/ 504c5ad8142SEric van Gyzen /* 505d0e79aa3SJason Evans * The following functions are used by threading libraries for protection of 506d0e79aa3SJason Evans * malloc during fork(). 507c5ad8142SEric van Gyzen@@ -3919,4 +4001,11 @@ jemalloc_postfork_child(void) { 5081f0a49e8SJason Evans ctl_postfork_child(tsd_tsdn(tsd)); 509d0e79aa3SJason Evans } 510d0e79aa3SJason Evans 511d0e79aa3SJason Evans+void 512d0e79aa3SJason Evans+_malloc_first_thread(void) 513d0e79aa3SJason Evans+{ 514d0e79aa3SJason Evans+ 515d0e79aa3SJason Evans+ (void)malloc_mutex_first_thread(); 516d0e79aa3SJason Evans+} 517d0e79aa3SJason Evans+ 518d0e79aa3SJason Evans /******************************************************************************/ 519b7eaed25SJason Evansdiff --git a/src/malloc_io.c b/src/malloc_io.c 520c5ad8142SEric van Gyzenindex d7cb0f52..cda589c4 100644 521b7eaed25SJason Evans--- a/src/malloc_io.c 522b7eaed25SJason Evans+++ b/src/malloc_io.c 5230ef50b4eSJason Evans@@ -75,6 +75,20 @@ wrtmessage(void *cbopaque, const char *s) { 524b7eaed25SJason Evans 525b7eaed25SJason Evans JEMALLOC_EXPORT void (*je_malloc_message)(void *, const char *s); 526b7eaed25SJason Evans 527b7eaed25SJason Evans+JEMALLOC_ATTR(visibility("hidden")) 528b7eaed25SJason Evans+void 529b7eaed25SJason Evans+wrtmessage_1_0(const char *s1, const char *s2, const char *s3, const char *s4) { 530b7eaed25SJason Evans+ 531b7eaed25SJason Evans+ wrtmessage(NULL, s1); 532b7eaed25SJason Evans+ wrtmessage(NULL, s2); 533b7eaed25SJason Evans+ wrtmessage(NULL, s3); 534b7eaed25SJason Evans+ wrtmessage(NULL, s4); 535b7eaed25SJason Evans+} 536b7eaed25SJason Evans+ 537b7eaed25SJason Evans+void (*__malloc_message_1_0)(const char *s1, const char *s2, const char *s3, 538b7eaed25SJason Evans+ const char *s4) = wrtmessage_1_0; 539b7eaed25SJason Evans+__sym_compat(_malloc_message, __malloc_message_1_0, FBSD_1.0); 540b7eaed25SJason Evans+ 541b7eaed25SJason Evans /* 542b7eaed25SJason Evans * Wrapper around malloc_message() that avoids the need for 543b7eaed25SJason Evans * je_malloc_message(...) throughout the code. 544a4bd5210SJason Evansdiff --git a/src/mutex.c b/src/mutex.c 545c5ad8142SEric van Gyzenindex 3f920f5b..88a7730c 100644 546a4bd5210SJason Evans--- a/src/mutex.c 547a4bd5210SJason Evans+++ b/src/mutex.c 5480ef50b4eSJason Evans@@ -41,6 +41,17 @@ pthread_create(pthread_t *__restrict thread, 549a4bd5210SJason Evans #ifdef JEMALLOC_MUTEX_INIT_CB 55082872ac0SJason Evans JEMALLOC_EXPORT int _pthread_mutex_init_calloc_cb(pthread_mutex_t *mutex, 551a4bd5210SJason Evans void *(calloc_cb)(size_t, size_t)); 552a4bd5210SJason Evans+ 553d0e79aa3SJason Evans+#pragma weak _pthread_mutex_init_calloc_cb 554a4bd5210SJason Evans+int 555d0e79aa3SJason Evans+_pthread_mutex_init_calloc_cb(pthread_mutex_t *mutex, 556a4bd5210SJason Evans+ void *(calloc_cb)(size_t, size_t)) 557a4bd5210SJason Evans+{ 558a4bd5210SJason Evans+ 559d0e79aa3SJason Evans+ return (((int (*)(pthread_mutex_t *, void *(*)(size_t, size_t))) 560d0e79aa3SJason Evans+ __libc_interposing[INTERPOS__pthread_mutex_init_calloc_cb])(mutex, 561d0e79aa3SJason Evans+ calloc_cb)); 562a4bd5210SJason Evans+} 563a4bd5210SJason Evans #endif 564a4bd5210SJason Evans 565b7eaed25SJason Evans void 5660ef50b4eSJason Evans@@ -131,6 +142,16 @@ mutex_addr_comp(const witness_t *witness1, void *mutex1, 567d0e79aa3SJason Evans } 568c5ad8142SEric van Gyzen } 569d0e79aa3SJason Evans 570c5ad8142SEric van Gyzen+bool 571b7eaed25SJason Evans+malloc_mutex_first_thread(void) { 572d0e79aa3SJason Evans+ 573d0e79aa3SJason Evans+#ifndef JEMALLOC_MUTEX_INIT_CB 574d0e79aa3SJason Evans+ return (malloc_mutex_first_thread()); 575d0e79aa3SJason Evans+#else 576d0e79aa3SJason Evans+ return (false); 577d0e79aa3SJason Evans+#endif 578d0e79aa3SJason Evans+} 579a4bd5210SJason Evans+ 580c5ad8142SEric van Gyzen bool 581b7eaed25SJason Evans malloc_mutex_init(malloc_mutex_t *mutex, const char *name, 582b7eaed25SJason Evans witness_rank_t rank, malloc_mutex_lock_order_t lock_order) { 583