Implement malloc_getcpu for amd64 and arm64 macOS

This enables per CPU arena on MacOS
This commit is contained in:
David Carlier 2022-05-20 20:14:33 +01:00 committed by Alex Lapenkou
parent df7ad8a9b6
commit df8f7d10af
2 changed files with 26 additions and 0 deletions

View File

@ -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
;; ;;
*) *)

View File

@ -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;