1a4bd5210SJason Evansdiff --git a/doc/jemalloc.xml.in b/doc/jemalloc.xml.in 2*b7eaed25SJason Evansindex 21e401ac..f977c5f5 100644 3a4bd5210SJason Evans--- a/doc/jemalloc.xml.in 4a4bd5210SJason Evans+++ b/doc/jemalloc.xml.in 5*b7eaed25SJason Evans@@ -53,11 +53,21 @@ 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>, 12*b7eaed25SJason Evans+ <option>--enable-lazy-lock</option>, <option>--enable-stats</option>, 13*b7eaed25SJason Evans+ <option>--enable-utrace</option>, and <option>--enable-xmalloc</option>. 14*b7eaed25SJason Evans+ Additionally, <option>--enable-debug</option> is enabled in development 15*b7eaed25SJason Evans+ versions of FreeBSD (controlled by the 16*b7eaed25SJason Evans+ <constant>MALLOC_PRODUCTION</constant> make variable).</para> 17d0e79aa3SJason Evans+ 18a4bd5210SJason Evans </refsect1> 19a4bd5210SJason Evans <refsynopsisdiv> 20a4bd5210SJason Evans <title>SYNOPSIS</title> 21c13244b9SJason Evans <funcsynopsis> 22c13244b9SJason Evans- <funcsynopsisinfo>#include <<filename class="headerfile">jemalloc/jemalloc.h</filename>></funcsynopsisinfo> 23c13244b9SJason Evans+ <funcsynopsisinfo>#include <<filename class="headerfile">stdlib.h</filename>> 24c13244b9SJason Evans+#include <<filename class="headerfile">malloc_np.h</filename>></funcsynopsisinfo> 25c13244b9SJason Evans <refsect2> 26c13244b9SJason Evans <title>Standard API</title> 27c13244b9SJason Evans <funcprototype> 28*b7eaed25SJason Evans@@ -3252,4 +3262,18 @@ malloc_conf = "narenas:1";]]></programlisting></para> 29bde95144SJason Evans <para>The <function>posix_memalign()</function> function conforms 30bde95144SJason Evans to IEEE Std 1003.1-2001 (<quote>POSIX.1</quote>).</para> 31a4bd5210SJason Evans </refsect1> 32a4bd5210SJason Evans+ <refsect1 id="history"> 33a4bd5210SJason Evans+ <title>HISTORY</title> 34bde95144SJason Evans+ <para>The <function>malloc_usable_size()</function> and 35bde95144SJason Evans+ <function>posix_memalign()</function> functions first appeared in FreeBSD 36bde95144SJason Evans+ 7.0.</para> 37a4bd5210SJason Evans+ 38bde95144SJason Evans+ <para>The <function>aligned_alloc()</function>, 39bde95144SJason Evans+ <function>malloc_stats_print()</function>, and 40bde95144SJason Evans+ <function>mallctl*()</function> functions first appeared in FreeBSD 41bde95144SJason Evans+ 10.0.</para> 42f921d10fSJason Evans+ 43bde95144SJason Evans+ <para>The <function>*allocx()</function> functions first appeared in FreeBSD 44bde95144SJason Evans+ 11.0.</para> 45a4bd5210SJason Evans+ </refsect1> 46a4bd5210SJason Evans </refentry> 47*b7eaed25SJason Evansdiff --git a/include/jemalloc/internal/hooks.h b/include/jemalloc/internal/hooks.h 48*b7eaed25SJason Evansindex cd49afcb..85e2a991 100644 49*b7eaed25SJason Evans--- a/include/jemalloc/internal/hooks.h 50*b7eaed25SJason Evans+++ b/include/jemalloc/internal/hooks.h 51*b7eaed25SJason Evans@@ -6,13 +6,6 @@ extern JEMALLOC_EXPORT void (*hooks_libc_hook)(); 52fbb1d85eSJason Evans 53*b7eaed25SJason Evans #define JEMALLOC_HOOK(fn, hook) ((void)(hook != NULL && (hook(), 0)), fn) 54fbb1d85eSJason Evans 55*b7eaed25SJason Evans-#define open JEMALLOC_HOOK(open, hooks_libc_hook) 56*b7eaed25SJason Evans-#define read JEMALLOC_HOOK(read, hooks_libc_hook) 57*b7eaed25SJason Evans-#define write JEMALLOC_HOOK(write, hooks_libc_hook) 58*b7eaed25SJason Evans-#define readlink JEMALLOC_HOOK(readlink, hooks_libc_hook) 59*b7eaed25SJason Evans-#define close JEMALLOC_HOOK(close, hooks_libc_hook) 60*b7eaed25SJason Evans-#define creat JEMALLOC_HOOK(creat, hooks_libc_hook) 61*b7eaed25SJason Evans-#define secure_getenv JEMALLOC_HOOK(secure_getenv, hooks_libc_hook) 62*b7eaed25SJason Evans /* Note that this is undef'd and re-define'd in src/prof.c. */ 63*b7eaed25SJason Evans #define _Unwind_Backtrace JEMALLOC_HOOK(_Unwind_Backtrace, hooks_libc_hook) 64fbb1d85eSJason Evans 65*b7eaed25SJason Evansdiff --git a/include/jemalloc/internal/jemalloc_internal_decls.h b/include/jemalloc/internal/jemalloc_internal_decls.h 66*b7eaed25SJason Evansindex 1efdb56b..12a7e5a8 100644 67*b7eaed25SJason Evans--- a/include/jemalloc/internal/jemalloc_internal_decls.h 68*b7eaed25SJason Evans+++ b/include/jemalloc/internal/jemalloc_internal_decls.h 69*b7eaed25SJason Evans@@ -1,6 +1,9 @@ 70*b7eaed25SJason Evans #ifndef JEMALLOC_INTERNAL_DECLS_H 71*b7eaed25SJason Evans #define JEMALLOC_INTERNAL_DECLS_H 72fbb1d85eSJason Evans 73*b7eaed25SJason Evans+#include "libc_private.h" 74*b7eaed25SJason Evans+#include "namespace.h" 75*b7eaed25SJason Evans+ 76*b7eaed25SJason Evans #include <math.h> 77*b7eaed25SJason Evans #ifdef _WIN32 78*b7eaed25SJason Evans # include <windows.h> 79*b7eaed25SJason Evansdiff --git a/include/jemalloc/internal/jemalloc_preamble.h.in b/include/jemalloc/internal/jemalloc_preamble.h.in 80*b7eaed25SJason Evansindex 18539a09..c8af8683 100644 81*b7eaed25SJason Evans--- a/include/jemalloc/internal/jemalloc_preamble.h.in 82*b7eaed25SJason Evans+++ b/include/jemalloc/internal/jemalloc_preamble.h.in 83d0e79aa3SJason Evans@@ -8,6 +8,9 @@ 84d0e79aa3SJason Evans #include <sys/ktrace.h> 85e722f8f8SJason Evans #endif 86a4bd5210SJason Evans 87a4bd5210SJason Evans+#include "un-namespace.h" 88a4bd5210SJason Evans+#include "libc_private.h" 89a4bd5210SJason Evans+ 90a4bd5210SJason Evans #define JEMALLOC_NO_DEMANGLE 91f921d10fSJason Evans #ifdef JEMALLOC_JET 92*b7eaed25SJason Evans # undef JEMALLOC_IS_MALLOC 93*b7eaed25SJason Evans@@ -68,13 +71,7 @@ static const bool config_fill = 94edaa25bdSJason Evans false 95edaa25bdSJason Evans #endif 96edaa25bdSJason Evans ; 97edaa25bdSJason Evans-static const bool config_lazy_lock = 98edaa25bdSJason Evans-#ifdef JEMALLOC_LAZY_LOCK 99edaa25bdSJason Evans- true 100edaa25bdSJason Evans-#else 101edaa25bdSJason Evans- false 102edaa25bdSJason Evans-#endif 103edaa25bdSJason Evans- ; 104edaa25bdSJason Evans+static const bool config_lazy_lock = true; 105df0d881dSJason Evans static const char * const config_malloc_conf = JEMALLOC_CONFIG_MALLOC_CONF; 106edaa25bdSJason Evans static const bool config_prof = 107edaa25bdSJason Evans #ifdef JEMALLOC_PROF 108a4bd5210SJason Evansdiff --git a/include/jemalloc/internal/mutex.h b/include/jemalloc/internal/mutex.h 109*b7eaed25SJason Evansindex 6520c251..0013cbe9 100644 110a4bd5210SJason Evans--- a/include/jemalloc/internal/mutex.h 111a4bd5210SJason Evans+++ b/include/jemalloc/internal/mutex.h 112*b7eaed25SJason Evans@@ -121,9 +121,6 @@ struct malloc_mutex_s { 113a4bd5210SJason Evans 114a4bd5210SJason Evans #ifdef JEMALLOC_LAZY_LOCK 115a4bd5210SJason Evans extern bool isthreaded; 116a4bd5210SJason Evans-#else 1178ed34ab0SJason Evans-# undef isthreaded /* Undo private_namespace.h definition. */ 118a4bd5210SJason Evans-# define isthreaded true 119a4bd5210SJason Evans #endif 120a4bd5210SJason Evans 1211f0a49e8SJason Evans bool malloc_mutex_init(malloc_mutex_t *mutex, const char *name, 122*b7eaed25SJason Evans@@ -131,6 +128,7 @@ bool malloc_mutex_init(malloc_mutex_t *mutex, const char *name, 1231f0a49e8SJason Evans void malloc_mutex_prefork(tsdn_t *tsdn, malloc_mutex_t *mutex); 1241f0a49e8SJason Evans void malloc_mutex_postfork_parent(tsdn_t *tsdn, malloc_mutex_t *mutex); 1251f0a49e8SJason Evans void malloc_mutex_postfork_child(tsdn_t *tsdn, malloc_mutex_t *mutex); 126d0e79aa3SJason Evans+bool malloc_mutex_first_thread(void); 1271f0a49e8SJason Evans bool malloc_mutex_boot(void); 128*b7eaed25SJason Evans void malloc_mutex_prof_data_reset(tsdn_t *tsdn, malloc_mutex_t *mutex); 129d0e79aa3SJason Evans 130a4bd5210SJason Evansdiff --git a/include/jemalloc/jemalloc_FreeBSD.h b/include/jemalloc/jemalloc_FreeBSD.h 131a4bd5210SJason Evansnew file mode 100644 132*b7eaed25SJason Evansindex 00000000..355b565c 133a4bd5210SJason Evans--- /dev/null 134a4bd5210SJason Evans+++ b/include/jemalloc/jemalloc_FreeBSD.h 135*b7eaed25SJason Evans@@ -0,0 +1,185 @@ 136a4bd5210SJason Evans+/* 137a4bd5210SJason Evans+ * Override settings that were generated in jemalloc_defs.h as necessary. 138a4bd5210SJason Evans+ */ 139a4bd5210SJason Evans+ 140a4bd5210SJason Evans+#undef JEMALLOC_OVERRIDE_VALLOC 141a4bd5210SJason Evans+ 142a4bd5210SJason Evans+#ifndef MALLOC_PRODUCTION 143a4bd5210SJason Evans+#define JEMALLOC_DEBUG 144a4bd5210SJason Evans+#endif 145a4bd5210SJason Evans+ 1461f0a49e8SJason Evans+#undef JEMALLOC_DSS 1471f0a49e8SJason Evans+ 148*b7eaed25SJason Evans+#undef JEMALLOC_BACKGROUND_THREAD 149*b7eaed25SJason Evans+ 150a4bd5210SJason Evans+/* 151a4bd5210SJason Evans+ * The following are architecture-dependent, so conditionally define them for 152a4bd5210SJason Evans+ * each supported architecture. 153a4bd5210SJason Evans+ */ 154a4bd5210SJason Evans+#undef JEMALLOC_TLS_MODEL 155a4bd5210SJason Evans+#undef STATIC_PAGE_SHIFT 156*b7eaed25SJason Evans+#undef LG_VADDR 157a4bd5210SJason Evans+#undef LG_SIZEOF_PTR 158a4bd5210SJason Evans+#undef LG_SIZEOF_INT 159a4bd5210SJason Evans+#undef LG_SIZEOF_LONG 160a4bd5210SJason Evans+#undef LG_SIZEOF_INTMAX_T 161a4bd5210SJason Evans+ 162a4bd5210SJason Evans+#ifdef __i386__ 163*b7eaed25SJason Evans+# define LG_VADDR 32 164a4bd5210SJason Evans+# define LG_SIZEOF_PTR 2 165a4bd5210SJason Evans+# define JEMALLOC_TLS_MODEL __attribute__((tls_model("initial-exec"))) 166a4bd5210SJason Evans+#endif 167a4bd5210SJason Evans+#ifdef __ia64__ 168*b7eaed25SJason Evans+# define LG_VADDR 64 169a4bd5210SJason Evans+# define LG_SIZEOF_PTR 3 170a4bd5210SJason Evans+#endif 171a4bd5210SJason Evans+#ifdef __sparc64__ 172*b7eaed25SJason Evans+# define LG_VADDR 64 173a4bd5210SJason Evans+# define LG_SIZEOF_PTR 3 174a4bd5210SJason Evans+# define JEMALLOC_TLS_MODEL __attribute__((tls_model("initial-exec"))) 175a4bd5210SJason Evans+#endif 176a4bd5210SJason Evans+#ifdef __amd64__ 177*b7eaed25SJason Evans+# define LG_VADDR 48 178a4bd5210SJason Evans+# define LG_SIZEOF_PTR 3 179a4bd5210SJason Evans+# define JEMALLOC_TLS_MODEL __attribute__((tls_model("initial-exec"))) 180a4bd5210SJason Evans+#endif 181a4bd5210SJason Evans+#ifdef __arm__ 182*b7eaed25SJason Evans+# define LG_VADDR 32 183a4bd5210SJason Evans+# define LG_SIZEOF_PTR 2 184a4bd5210SJason Evans+#endif 185d8e39d2dSJason Evans+#ifdef __aarch64__ 186*b7eaed25SJason Evans+# define LG_VADDR 48 187d8e39d2dSJason Evans+# define LG_SIZEOF_PTR 3 188d8e39d2dSJason Evans+#endif 189a4bd5210SJason Evans+#ifdef __mips__ 190e722f8f8SJason Evans+#ifdef __mips_n64 191*b7eaed25SJason Evans+# define LG_VADDR 64 192e722f8f8SJason Evans+# define LG_SIZEOF_PTR 3 193e722f8f8SJason Evans+#else 194*b7eaed25SJason Evans+# define LG_VADDR 32 195a4bd5210SJason Evans+# define LG_SIZEOF_PTR 2 196a4bd5210SJason Evans+#endif 197e722f8f8SJason Evans+#endif 198a4bd5210SJason Evans+#ifdef __powerpc64__ 199*b7eaed25SJason Evans+# define LG_VADDR 64 200a4bd5210SJason Evans+# define LG_SIZEOF_PTR 3 201a4bd5210SJason Evans+#elif defined(__powerpc__) 202*b7eaed25SJason Evans+# define LG_VADDR 32 203a4bd5210SJason Evans+# define LG_SIZEOF_PTR 2 204a4bd5210SJason Evans+#endif 205df0d881dSJason Evans+#ifdef __riscv__ 206*b7eaed25SJason Evans+# define LG_VADDR 64 207df0d881dSJason Evans+# define LG_SIZEOF_PTR 3 208df0d881dSJason Evans+#endif 209a4bd5210SJason Evans+ 210a4bd5210SJason Evans+#ifndef JEMALLOC_TLS_MODEL 211a4bd5210SJason Evans+# define JEMALLOC_TLS_MODEL /* Default. */ 212a4bd5210SJason Evans+#endif 213a4bd5210SJason Evans+ 214a4bd5210SJason Evans+#define STATIC_PAGE_SHIFT PAGE_SHIFT 215a4bd5210SJason Evans+#define LG_SIZEOF_INT 2 216a4bd5210SJason Evans+#define LG_SIZEOF_LONG LG_SIZEOF_PTR 217a4bd5210SJason Evans+#define LG_SIZEOF_INTMAX_T 3 218a4bd5210SJason Evans+ 219337776f8SJason Evans+#undef CPU_SPINWAIT 220337776f8SJason Evans+#include <machine/cpu.h> 221337776f8SJason Evans+#include <machine/cpufunc.h> 222337776f8SJason Evans+#define CPU_SPINWAIT cpu_spinwait() 223337776f8SJason Evans+ 224a4bd5210SJason Evans+/* Disable lazy-lock machinery, mangle isthreaded, and adjust its type. */ 225a4bd5210SJason Evans+#undef JEMALLOC_LAZY_LOCK 226a4bd5210SJason Evans+extern int __isthreaded; 227a4bd5210SJason Evans+#define isthreaded ((bool)__isthreaded) 228a4bd5210SJason Evans+ 229a4bd5210SJason Evans+/* Mangle. */ 230f8ca2db1SJason Evans+#undef je_malloc 231f8ca2db1SJason Evans+#undef je_calloc 232f8ca2db1SJason Evans+#undef je_posix_memalign 233d0e79aa3SJason Evans+#undef je_aligned_alloc 234df0d881dSJason Evans+#undef je_realloc 235df0d881dSJason Evans+#undef je_free 236f8ca2db1SJason Evans+#undef je_malloc_usable_size 237f921d10fSJason Evans+#undef je_mallocx 238f921d10fSJason Evans+#undef je_rallocx 239f921d10fSJason Evans+#undef je_xallocx 240f921d10fSJason Evans+#undef je_sallocx 241f921d10fSJason Evans+#undef je_dallocx 242df0d881dSJason Evans+#undef je_sdallocx 243f921d10fSJason Evans+#undef je_nallocx 244df0d881dSJason Evans+#undef je_mallctl 245df0d881dSJason Evans+#undef je_mallctlnametomib 246df0d881dSJason Evans+#undef je_mallctlbymib 247df0d881dSJason Evans+#undef je_malloc_stats_print 248f8ca2db1SJason Evans+#undef je_allocm 249f8ca2db1SJason Evans+#undef je_rallocm 250f8ca2db1SJason Evans+#undef je_sallocm 251f8ca2db1SJason Evans+#undef je_dallocm 252f8ca2db1SJason Evans+#undef je_nallocm 253f8ca2db1SJason Evans+#define je_malloc __malloc 254f8ca2db1SJason Evans+#define je_calloc __calloc 255f8ca2db1SJason Evans+#define je_posix_memalign __posix_memalign 256d0e79aa3SJason Evans+#define je_aligned_alloc __aligned_alloc 257df0d881dSJason Evans+#define je_realloc __realloc 258df0d881dSJason Evans+#define je_free __free 259f8ca2db1SJason Evans+#define je_malloc_usable_size __malloc_usable_size 260f921d10fSJason Evans+#define je_mallocx __mallocx 261f921d10fSJason Evans+#define je_rallocx __rallocx 262f921d10fSJason Evans+#define je_xallocx __xallocx 263f921d10fSJason Evans+#define je_sallocx __sallocx 264f921d10fSJason Evans+#define je_dallocx __dallocx 265df0d881dSJason Evans+#define je_sdallocx __sdallocx 266f921d10fSJason Evans+#define je_nallocx __nallocx 267df0d881dSJason Evans+#define je_mallctl __mallctl 268df0d881dSJason Evans+#define je_mallctlnametomib __mallctlnametomib 269df0d881dSJason Evans+#define je_mallctlbymib __mallctlbymib 270df0d881dSJason Evans+#define je_malloc_stats_print __malloc_stats_print 271f8ca2db1SJason Evans+#define je_allocm __allocm 272f8ca2db1SJason Evans+#define je_rallocm __rallocm 273f8ca2db1SJason Evans+#define je_sallocm __sallocm 274f8ca2db1SJason Evans+#define je_dallocm __dallocm 275f8ca2db1SJason Evans+#define je_nallocm __nallocm 276a4bd5210SJason Evans+#define open _open 277a4bd5210SJason Evans+#define read _read 278a4bd5210SJason Evans+#define write _write 279a4bd5210SJason Evans+#define close _close 280*b7eaed25SJason Evans+#define pthread_join _pthread_join 281*b7eaed25SJason Evans+#define pthread_once _pthread_once 282*b7eaed25SJason Evans+#define pthread_self _pthread_self 283*b7eaed25SJason Evans+#define pthread_equal _pthread_equal 284a4bd5210SJason Evans+#define pthread_mutex_lock _pthread_mutex_lock 285*b7eaed25SJason Evans+#define pthread_mutex_trylock _pthread_mutex_trylock 286a4bd5210SJason Evans+#define pthread_mutex_unlock _pthread_mutex_unlock 287*b7eaed25SJason Evans+#define pthread_cond_init _pthread_cond_init 288*b7eaed25SJason Evans+#define pthread_cond_wait _pthread_cond_wait 289*b7eaed25SJason Evans+#define pthread_cond_timedwait _pthread_cond_timedwait 290*b7eaed25SJason Evans+#define pthread_cond_signal _pthread_cond_signal 291f8ca2db1SJason Evans+ 292f8ca2db1SJason Evans+#ifdef JEMALLOC_C_ 293f8ca2db1SJason Evans+/* 294f8ca2db1SJason Evans+ * Define 'weak' symbols so that an application can have its own versions 295f8ca2db1SJason Evans+ * of malloc, calloc, realloc, free, et al. 296f8ca2db1SJason Evans+ */ 297f8ca2db1SJason Evans+__weak_reference(__malloc, malloc); 298f8ca2db1SJason Evans+__weak_reference(__calloc, calloc); 299f8ca2db1SJason Evans+__weak_reference(__posix_memalign, posix_memalign); 300d0e79aa3SJason Evans+__weak_reference(__aligned_alloc, aligned_alloc); 301df0d881dSJason Evans+__weak_reference(__realloc, realloc); 302df0d881dSJason Evans+__weak_reference(__free, free); 303f8ca2db1SJason Evans+__weak_reference(__malloc_usable_size, malloc_usable_size); 304f921d10fSJason Evans+__weak_reference(__mallocx, mallocx); 305f921d10fSJason Evans+__weak_reference(__rallocx, rallocx); 306f921d10fSJason Evans+__weak_reference(__xallocx, xallocx); 307f921d10fSJason Evans+__weak_reference(__sallocx, sallocx); 308f921d10fSJason Evans+__weak_reference(__dallocx, dallocx); 309df0d881dSJason Evans+__weak_reference(__sdallocx, sdallocx); 310f921d10fSJason Evans+__weak_reference(__nallocx, nallocx); 311df0d881dSJason Evans+__weak_reference(__mallctl, mallctl); 312df0d881dSJason Evans+__weak_reference(__mallctlnametomib, mallctlnametomib); 313df0d881dSJason Evans+__weak_reference(__mallctlbymib, mallctlbymib); 314df0d881dSJason Evans+__weak_reference(__malloc_stats_print, malloc_stats_print); 315f8ca2db1SJason Evans+__weak_reference(__allocm, allocm); 316f8ca2db1SJason Evans+__weak_reference(__rallocm, rallocm); 317f8ca2db1SJason Evans+__weak_reference(__sallocm, sallocm); 318f8ca2db1SJason Evans+__weak_reference(__dallocm, dallocm); 319f8ca2db1SJason Evans+__weak_reference(__nallocm, nallocm); 320f8ca2db1SJason Evans+#endif 321f921d10fSJason Evansdiff --git a/include/jemalloc/jemalloc_rename.sh b/include/jemalloc/jemalloc_rename.sh 322*b7eaed25SJason Evansindex f9438912..47d032c1 100755 323f921d10fSJason Evans--- a/include/jemalloc/jemalloc_rename.sh 324f921d10fSJason Evans+++ b/include/jemalloc/jemalloc_rename.sh 325f921d10fSJason Evans@@ -19,4 +19,6 @@ done 326f921d10fSJason Evans 327f921d10fSJason Evans cat <<EOF 328f921d10fSJason Evans #endif 329f8ca2db1SJason Evans+ 330f921d10fSJason Evans+#include "jemalloc_FreeBSD.h" 331f921d10fSJason Evans EOF 332a4bd5210SJason Evansdiff --git a/src/jemalloc.c b/src/jemalloc.c 333*b7eaed25SJason Evansindex 52c86aa6..868c9e86 100644 334a4bd5210SJason Evans--- a/src/jemalloc.c 335a4bd5210SJason Evans+++ b/src/jemalloc.c 336*b7eaed25SJason Evans@@ -20,6 +20,10 @@ 337d0e79aa3SJason Evans /******************************************************************************/ 338d0e79aa3SJason Evans /* Data. */ 339a4bd5210SJason Evans 340e722f8f8SJason Evans+/* Work around <http://llvm.org/bugs/show_bug.cgi?id=12623>: */ 341e722f8f8SJason Evans+const char *__malloc_options_1_0 = NULL; 342a4bd5210SJason Evans+__sym_compat(_malloc_options, __malloc_options_1_0, FBSD_1.0); 343a4bd5210SJason Evans+ 344a4bd5210SJason Evans /* Runtime configuration options. */ 345bde95144SJason Evans const char *je_malloc_conf 346bde95144SJason Evans #ifndef _WIN32 347*b7eaed25SJason Evans@@ -2981,6 +2985,103 @@ je_malloc_usable_size(JEMALLOC_USABLE_SIZE_CONST void *ptr) { 348d0e79aa3SJason Evans */ 349d0e79aa3SJason Evans /******************************************************************************/ 350a4bd5210SJason Evans /* 351d0e79aa3SJason Evans+ * Begin compatibility functions. 352d0e79aa3SJason Evans+ */ 353d0e79aa3SJason Evans+ 354d0e79aa3SJason Evans+#define ALLOCM_LG_ALIGN(la) (la) 355d0e79aa3SJason Evans+#define ALLOCM_ALIGN(a) (ffsl(a)-1) 356d0e79aa3SJason Evans+#define ALLOCM_ZERO ((int)0x40) 357d0e79aa3SJason Evans+#define ALLOCM_NO_MOVE ((int)0x80) 358d0e79aa3SJason Evans+ 359d0e79aa3SJason Evans+#define ALLOCM_SUCCESS 0 360d0e79aa3SJason Evans+#define ALLOCM_ERR_OOM 1 361d0e79aa3SJason Evans+#define ALLOCM_ERR_NOT_MOVED 2 362d0e79aa3SJason Evans+ 363d0e79aa3SJason Evans+int 364*b7eaed25SJason Evans+je_allocm(void **ptr, size_t *rsize, size_t size, int flags) { 365d0e79aa3SJason Evans+ assert(ptr != NULL); 366d0e79aa3SJason Evans+ 367*b7eaed25SJason Evans+ void *p = je_mallocx(size, flags); 368*b7eaed25SJason Evans+ if (p == NULL) { 369d0e79aa3SJason Evans+ return (ALLOCM_ERR_OOM); 370*b7eaed25SJason Evans+ } 371*b7eaed25SJason Evans+ if (rsize != NULL) { 372*b7eaed25SJason Evans+ *rsize = isalloc(tsdn_fetch(), p); 373*b7eaed25SJason Evans+ } 374d0e79aa3SJason Evans+ *ptr = p; 375*b7eaed25SJason Evans+ return ALLOCM_SUCCESS; 376d0e79aa3SJason Evans+} 377d0e79aa3SJason Evans+ 378d0e79aa3SJason Evans+int 379*b7eaed25SJason Evans+je_rallocm(void **ptr, size_t *rsize, size_t size, size_t extra, int flags) { 380d0e79aa3SJason Evans+ assert(ptr != NULL); 381d0e79aa3SJason Evans+ assert(*ptr != NULL); 382d0e79aa3SJason Evans+ assert(size != 0); 383d0e79aa3SJason Evans+ assert(SIZE_T_MAX - size >= extra); 384d0e79aa3SJason Evans+ 385*b7eaed25SJason Evans+ int ret; 386*b7eaed25SJason Evans+ bool no_move = flags & ALLOCM_NO_MOVE; 387*b7eaed25SJason Evans+ 388d0e79aa3SJason Evans+ if (no_move) { 389d0e79aa3SJason Evans+ size_t usize = je_xallocx(*ptr, size, extra, flags); 390d0e79aa3SJason Evans+ ret = (usize >= size) ? ALLOCM_SUCCESS : ALLOCM_ERR_NOT_MOVED; 391*b7eaed25SJason Evans+ if (rsize != NULL) { 392d0e79aa3SJason Evans+ *rsize = usize; 393*b7eaed25SJason Evans+ } 394d0e79aa3SJason Evans+ } else { 395d0e79aa3SJason Evans+ void *p = je_rallocx(*ptr, size+extra, flags); 396d0e79aa3SJason Evans+ if (p != NULL) { 397d0e79aa3SJason Evans+ *ptr = p; 398d0e79aa3SJason Evans+ ret = ALLOCM_SUCCESS; 399*b7eaed25SJason Evans+ } else { 400d0e79aa3SJason Evans+ ret = ALLOCM_ERR_OOM; 401d0e79aa3SJason Evans+ } 402*b7eaed25SJason Evans+ if (rsize != NULL) { 403*b7eaed25SJason Evans+ *rsize = isalloc(tsdn_fetch(), *ptr); 404*b7eaed25SJason Evans+ } 405*b7eaed25SJason Evans+ } 406*b7eaed25SJason Evans+ return ret; 407d0e79aa3SJason Evans+} 408d0e79aa3SJason Evans+ 409d0e79aa3SJason Evans+int 410*b7eaed25SJason Evans+je_sallocm(const void *ptr, size_t *rsize, int flags) { 411d0e79aa3SJason Evans+ assert(rsize != NULL); 412d0e79aa3SJason Evans+ *rsize = je_sallocx(ptr, flags); 413*b7eaed25SJason Evans+ return ALLOCM_SUCCESS; 414d0e79aa3SJason Evans+} 415d0e79aa3SJason Evans+ 416d0e79aa3SJason Evans+int 417*b7eaed25SJason Evans+je_dallocm(void *ptr, int flags) { 418d0e79aa3SJason Evans+ je_dallocx(ptr, flags); 419*b7eaed25SJason Evans+ return ALLOCM_SUCCESS; 420d0e79aa3SJason Evans+} 421d0e79aa3SJason Evans+ 422d0e79aa3SJason Evans+int 423*b7eaed25SJason Evans+je_nallocm(size_t *rsize, size_t size, int flags) { 424*b7eaed25SJason Evans+ size_t usize = je_nallocx(size, flags); 425*b7eaed25SJason Evans+ if (usize == 0) { 426*b7eaed25SJason Evans+ return ALLOCM_ERR_OOM; 427*b7eaed25SJason Evans+ } 428*b7eaed25SJason Evans+ if (rsize != NULL) { 429d0e79aa3SJason Evans+ *rsize = usize; 430*b7eaed25SJason Evans+ } 431*b7eaed25SJason Evans+ return ALLOCM_SUCCESS; 432d0e79aa3SJason Evans+} 433d0e79aa3SJason Evans+ 434d0e79aa3SJason Evans+#undef ALLOCM_LG_ALIGN 435d0e79aa3SJason Evans+#undef ALLOCM_ALIGN 436d0e79aa3SJason Evans+#undef ALLOCM_ZERO 437d0e79aa3SJason Evans+#undef ALLOCM_NO_MOVE 438d0e79aa3SJason Evans+ 439d0e79aa3SJason Evans+#undef ALLOCM_SUCCESS 440d0e79aa3SJason Evans+#undef ALLOCM_ERR_OOM 441d0e79aa3SJason Evans+#undef ALLOCM_ERR_NOT_MOVED 442d0e79aa3SJason Evans+ 443d0e79aa3SJason Evans+/* 444d0e79aa3SJason Evans+ * End compatibility functions. 445d0e79aa3SJason Evans+ */ 446d0e79aa3SJason Evans+/******************************************************************************/ 447d0e79aa3SJason Evans+/* 448d0e79aa3SJason Evans * The following functions are used by threading libraries for protection of 449d0e79aa3SJason Evans * malloc during fork(). 450d0e79aa3SJason Evans */ 451*b7eaed25SJason Evans@@ -3141,4 +3242,11 @@ jemalloc_postfork_child(void) { 4521f0a49e8SJason Evans ctl_postfork_child(tsd_tsdn(tsd)); 453d0e79aa3SJason Evans } 454d0e79aa3SJason Evans 455d0e79aa3SJason Evans+void 456d0e79aa3SJason Evans+_malloc_first_thread(void) 457d0e79aa3SJason Evans+{ 458d0e79aa3SJason Evans+ 459d0e79aa3SJason Evans+ (void)malloc_mutex_first_thread(); 460d0e79aa3SJason Evans+} 461d0e79aa3SJason Evans+ 462d0e79aa3SJason Evans /******************************************************************************/ 463*b7eaed25SJason Evansdiff --git a/src/malloc_io.c b/src/malloc_io.c 464*b7eaed25SJason Evansindex 6b99afcd..4363cb83 100644 465*b7eaed25SJason Evans--- a/src/malloc_io.c 466*b7eaed25SJason Evans+++ b/src/malloc_io.c 467*b7eaed25SJason Evans@@ -88,6 +88,20 @@ wrtmessage(void *cbopaque, const char *s) { 468*b7eaed25SJason Evans 469*b7eaed25SJason Evans JEMALLOC_EXPORT void (*je_malloc_message)(void *, const char *s); 470*b7eaed25SJason Evans 471*b7eaed25SJason Evans+JEMALLOC_ATTR(visibility("hidden")) 472*b7eaed25SJason Evans+void 473*b7eaed25SJason Evans+wrtmessage_1_0(const char *s1, const char *s2, const char *s3, const char *s4) { 474*b7eaed25SJason Evans+ 475*b7eaed25SJason Evans+ wrtmessage(NULL, s1); 476*b7eaed25SJason Evans+ wrtmessage(NULL, s2); 477*b7eaed25SJason Evans+ wrtmessage(NULL, s3); 478*b7eaed25SJason Evans+ wrtmessage(NULL, s4); 479*b7eaed25SJason Evans+} 480*b7eaed25SJason Evans+ 481*b7eaed25SJason Evans+void (*__malloc_message_1_0)(const char *s1, const char *s2, const char *s3, 482*b7eaed25SJason Evans+ const char *s4) = wrtmessage_1_0; 483*b7eaed25SJason Evans+__sym_compat(_malloc_message, __malloc_message_1_0, FBSD_1.0); 484*b7eaed25SJason Evans+ 485*b7eaed25SJason Evans /* 486*b7eaed25SJason Evans * Wrapper around malloc_message() that avoids the need for 487*b7eaed25SJason Evans * je_malloc_message(...) throughout the code. 488a4bd5210SJason Evansdiff --git a/src/mutex.c b/src/mutex.c 489*b7eaed25SJason Evansindex a528ef0c..820af613 100644 490a4bd5210SJason Evans--- a/src/mutex.c 491a4bd5210SJason Evans+++ b/src/mutex.c 492*b7eaed25SJason Evans@@ -40,6 +40,17 @@ pthread_create(pthread_t *__restrict thread, 493a4bd5210SJason Evans #ifdef JEMALLOC_MUTEX_INIT_CB 49482872ac0SJason Evans JEMALLOC_EXPORT int _pthread_mutex_init_calloc_cb(pthread_mutex_t *mutex, 495a4bd5210SJason Evans void *(calloc_cb)(size_t, size_t)); 496a4bd5210SJason Evans+ 497d0e79aa3SJason Evans+#pragma weak _pthread_mutex_init_calloc_cb 498a4bd5210SJason Evans+int 499d0e79aa3SJason Evans+_pthread_mutex_init_calloc_cb(pthread_mutex_t *mutex, 500a4bd5210SJason Evans+ void *(calloc_cb)(size_t, size_t)) 501a4bd5210SJason Evans+{ 502a4bd5210SJason Evans+ 503d0e79aa3SJason Evans+ return (((int (*)(pthread_mutex_t *, void *(*)(size_t, size_t))) 504d0e79aa3SJason Evans+ __libc_interposing[INTERPOS__pthread_mutex_init_calloc_cb])(mutex, 505d0e79aa3SJason Evans+ calloc_cb)); 506a4bd5210SJason Evans+} 507a4bd5210SJason Evans #endif 508a4bd5210SJason Evans 509*b7eaed25SJason Evans void 510*b7eaed25SJason Evans@@ -130,6 +141,16 @@ mutex_addr_comp(const witness_t *witness1, void *mutex1, 511d0e79aa3SJason Evans } 512d0e79aa3SJason Evans 513d0e79aa3SJason Evans bool 514*b7eaed25SJason Evans+malloc_mutex_first_thread(void) { 515d0e79aa3SJason Evans+ 516d0e79aa3SJason Evans+#ifndef JEMALLOC_MUTEX_INIT_CB 517d0e79aa3SJason Evans+ return (malloc_mutex_first_thread()); 518d0e79aa3SJason Evans+#else 519d0e79aa3SJason Evans+ return (false); 520d0e79aa3SJason Evans+#endif 521d0e79aa3SJason Evans+} 522a4bd5210SJason Evans+ 523*b7eaed25SJason Evans+bool 524*b7eaed25SJason Evans malloc_mutex_init(malloc_mutex_t *mutex, const char *name, 525*b7eaed25SJason Evans witness_rank_t rank, malloc_mutex_lock_order_t lock_order) { 526*b7eaed25SJason Evans mutex_prof_data_init(&mutex->prof_data); 527