Implement malloc_getcpu for amd64 and arm64 macOS
This enables per CPU arena on MacOS
This commit is contained in:
parent
df7ad8a9b6
commit
df8f7d10af
17
configure.ac
17
configure.ac
@ -510,6 +510,23 @@ typedef unsigned __int32 uint32_t;
|
|||||||
else
|
else
|
||||||
AC_MSG_ERROR([cannot determine number of significant virtual address bits])
|
AC_MSG_ERROR([cannot determine number of significant virtual address bits])
|
||||||
fi
|
fi
|
||||||
|
AC_CACHE_CHECK([rdtscp support],
|
||||||
|
[je_cv_rdtscp],
|
||||||
|
AC_RUN_IFELSE([AC_LANG_PROGRAM(
|
||||||
|
[[
|
||||||
|
#include <stdint.h>
|
||||||
|
]],
|
||||||
|
[[
|
||||||
|
unsigned int dx;
|
||||||
|
asm volatile("rdtscp" : "=d"(dx) ::);
|
||||||
|
return 0;
|
||||||
|
]])],
|
||||||
|
[je_cv_rdtscp=yes],
|
||||||
|
[je_cv_rdstcp=no],
|
||||||
|
[je_cv_rdtscp=no]))
|
||||||
|
if test "x${je_cv_rdtscp}" = "xyes"; then
|
||||||
|
AC_DEFINE([HAVE_RDTSCP], 1, [])
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
|
@ -14,6 +14,15 @@ malloc_getcpu(void) {
|
|||||||
return GetCurrentProcessorNumber();
|
return GetCurrentProcessorNumber();
|
||||||
#elif defined(JEMALLOC_HAVE_SCHED_GETCPU)
|
#elif defined(JEMALLOC_HAVE_SCHED_GETCPU)
|
||||||
return (malloc_cpuid_t)sched_getcpu();
|
return (malloc_cpuid_t)sched_getcpu();
|
||||||
|
#elif defined(HAVE_RDTSCP)
|
||||||
|
unsigned int ax, cx, dx;
|
||||||
|
asm volatile("rdtscp" : "=a"(ax), "=d"(dx), "=c"(cx) ::);
|
||||||
|
return (malloc_cpuid_t)(dx & 0xfff);
|
||||||
|
#elif defined(__aarch64__) && defined(__APPLE__)
|
||||||
|
/* Other oses most likely use tpidr_el0 instead */
|
||||||
|
uintptr_t c;
|
||||||
|
asm volatile("mrs %x0, tpidrro_el0" : "=r"(c) :: "memory");
|
||||||
|
return (malloc_cpuid_t)(c & (1 << 3) - 1);
|
||||||
#else
|
#else
|
||||||
not_reached();
|
not_reached();
|
||||||
return -1;
|
return -1;
|
||||||
|
Loading…
Reference in New Issue
Block a user