mirror of
https://github.com/microsoft/mimalloc.git
synced 2024-12-26 21:04:27 +08:00
merge from dev
This commit is contained in:
commit
70782c3670
@ -19,6 +19,7 @@ option(MI_OSX_INTERPOSE "Use interpose to override standard malloc on macOS"
|
|||||||
option(MI_OSX_ZONE "Use malloc zone to override standard malloc on macOS" ON)
|
option(MI_OSX_ZONE "Use malloc zone to override standard malloc on macOS" ON)
|
||||||
option(MI_WIN_REDIRECT "Use redirection module ('mimalloc-redirect') on Windows if compiling mimalloc as a DLL" ON)
|
option(MI_WIN_REDIRECT "Use redirection module ('mimalloc-redirect') on Windows if compiling mimalloc as a DLL" ON)
|
||||||
option(MI_LOCAL_DYNAMIC_TLS "Use slightly slower, dlopen-compatible TLS mechanism (Unix)" OFF)
|
option(MI_LOCAL_DYNAMIC_TLS "Use slightly slower, dlopen-compatible TLS mechanism (Unix)" OFF)
|
||||||
|
option(MI_LIBC_MUSL "Set this when linking with musl libc" OFF)
|
||||||
option(MI_BUILD_SHARED "Build shared library" ON)
|
option(MI_BUILD_SHARED "Build shared library" ON)
|
||||||
option(MI_BUILD_STATIC "Build static library" ON)
|
option(MI_BUILD_STATIC "Build static library" ON)
|
||||||
option(MI_BUILD_OBJECT "Build object library" ON)
|
option(MI_BUILD_OBJECT "Build object library" ON)
|
||||||
@ -286,6 +287,12 @@ if(CMAKE_SYSTEM_NAME MATCHES "Linux|Android")
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(MI_LIBC_MUSL)
|
||||||
|
message(STATUS "Assume using musl libc (MI_LIBC_MUSL=ON) (this implies MI_LOCAL_DYNAMIC_TLS=ON)")
|
||||||
|
set(MI_LOCAL_DYNAMIC_TLS "ON")
|
||||||
|
list(APPEND mi_defines MI_LIBC_MUSL=1)
|
||||||
|
endif()
|
||||||
|
|
||||||
# On Haiku use `-DCMAKE_INSTALL_PREFIX` instead, issue #788
|
# On Haiku use `-DCMAKE_INSTALL_PREFIX` instead, issue #788
|
||||||
# if(CMAKE_SYSTEM_NAME MATCHES "Haiku")
|
# if(CMAKE_SYSTEM_NAME MATCHES "Haiku")
|
||||||
# SET(CMAKE_INSTALL_LIBDIR ~/config/non-packaged/lib)
|
# SET(CMAKE_INSTALL_LIBDIR ~/config/non-packaged/lib)
|
||||||
|
@ -203,12 +203,23 @@ static inline void mi_prim_tls_slot_set(size_t slot, void* value) mi_attr_noexce
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Do we have __builtin_thread_pointer? (do not make this a compound test as it fails on older gcc's, see issue #851)
|
||||||
|
#if defined(__has_builtin)
|
||||||
|
#if __has_builtin(__builtin_thread_pointer)
|
||||||
|
#define MI_HAS_BUILTIN_THREAD_POINTER 1
|
||||||
|
#endif
|
||||||
|
#elif defined(__GNUC__) && (__GNUC__ >= 7) && defined(__aarch64__) // special case aarch64 for older gcc versions (issue #851)
|
||||||
|
#define MI_HAS_BUILTIN_THREAD_POINTER 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// defined in `init.c`; do not use these directly
|
// defined in `init.c`; do not use these directly
|
||||||
extern mi_decl_thread mi_heap_t* _mi_heap_default; // default heap to allocate from
|
extern mi_decl_thread mi_heap_t* _mi_heap_default; // default heap to allocate from
|
||||||
extern bool _mi_process_is_initialized; // has mi_process_init been called?
|
extern bool _mi_process_is_initialized; // has mi_process_init been called?
|
||||||
|
|
||||||
static inline mi_threadid_t _mi_prim_thread_id(void) mi_attr_noexcept;
|
static inline mi_threadid_t _mi_prim_thread_id(void) mi_attr_noexcept;
|
||||||
|
|
||||||
|
// Get a unique id for the current thread.
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
|
|
||||||
#define WIN32_LEAN_AND_MEAN
|
#define WIN32_LEAN_AND_MEAN
|
||||||
@ -218,7 +229,7 @@ static inline mi_threadid_t _mi_prim_thread_id(void) mi_attr_noexcept {
|
|||||||
return (uintptr_t)NtCurrentTeb();
|
return (uintptr_t)NtCurrentTeb();
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif defined(__has_builtin) && __has_builtin(__builtin_thread_pointer) && \
|
#elif MI_HAS_BUILTIN_THREAD_POINTER && \
|
||||||
(!defined(__APPLE__)) && /* on apple (M1) the wrong register is read (tpidr_el0 instead of tpidrro_el0) so fall back to TLS slot assembly (<https://github.com/microsoft/mimalloc/issues/343#issuecomment-763272369>)*/ \
|
(!defined(__APPLE__)) && /* on apple (M1) the wrong register is read (tpidr_el0 instead of tpidrro_el0) so fall back to TLS slot assembly (<https://github.com/microsoft/mimalloc/issues/343#issuecomment-763272369>)*/ \
|
||||||
(!defined(__clang_major__) || __clang_major__ >= 14) // older clang versions emit bad code; fall back to using the TLS slot (<https://lore.kernel.org/linux-arm-kernel/202110280952.352F66D8@keescook/T/>)
|
(!defined(__clang_major__) || __clang_major__ >= 14) // older clang versions emit bad code; fall back to using the TLS slot (<https://lore.kernel.org/linux-arm-kernel/202110280952.352F66D8@keescook/T/>)
|
||||||
|
|
||||||
|
@ -161,17 +161,24 @@ typedef int32_t mi_ssize_t;
|
|||||||
|
|
||||||
// Main tuning parameters for segment and page sizes
|
// Main tuning parameters for segment and page sizes
|
||||||
// Sizes for 64-bit (usually divide by two for 32-bit)
|
// Sizes for 64-bit (usually divide by two for 32-bit)
|
||||||
|
#ifndef MI_SEGMENT_SLICE_SHIFT
|
||||||
#define MI_SEGMENT_SLICE_SHIFT (13 + MI_INTPTR_SHIFT) // 64KiB (32KiB on 32-bit)
|
#define MI_SEGMENT_SLICE_SHIFT (13 + MI_INTPTR_SHIFT) // 64KiB (32KiB on 32-bit)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MI_SEGMENT_SHIFT
|
||||||
#if MI_INTPTR_SIZE > 4
|
#if MI_INTPTR_SIZE > 4
|
||||||
#define MI_SEGMENT_SHIFT ( 9 + MI_SEGMENT_SLICE_SHIFT) // 32MiB
|
#define MI_SEGMENT_SHIFT ( 9 + MI_SEGMENT_SLICE_SHIFT) // 32MiB
|
||||||
#else
|
#else
|
||||||
#define MI_SEGMENT_SHIFT ( 7 + MI_SEGMENT_SLICE_SHIFT) // 4MiB on 32-bit
|
#define MI_SEGMENT_SHIFT ( 7 + MI_SEGMENT_SLICE_SHIFT) // 4MiB on 32-bit
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MI_SMALL_PAGE_SHIFT
|
||||||
#define MI_SMALL_PAGE_SHIFT (MI_SEGMENT_SLICE_SHIFT) // 64KiB
|
#define MI_SMALL_PAGE_SHIFT (MI_SEGMENT_SLICE_SHIFT) // 64KiB
|
||||||
|
#endif
|
||||||
|
#ifndef MI_MEDIUM_PAGE_SHIFT
|
||||||
#define MI_MEDIUM_PAGE_SHIFT ( 3 + MI_SMALL_PAGE_SHIFT) // 512KiB
|
#define MI_MEDIUM_PAGE_SHIFT ( 3 + MI_SMALL_PAGE_SHIFT) // 512KiB
|
||||||
|
#endif
|
||||||
|
|
||||||
// Derived constants
|
// Derived constants
|
||||||
#define MI_SEGMENT_SIZE (MI_ZU(1)<<MI_SEGMENT_SHIFT)
|
#define MI_SEGMENT_SIZE (MI_ZU(1)<<MI_SEGMENT_SHIFT)
|
||||||
|
@ -148,7 +148,13 @@ void _mi_prim_mem_init( mi_os_mem_config_t* config )
|
|||||||
config->has_virtual_reserve = true; // todo: check if this true for NetBSD? (for anonymous mmap with PROT_NONE)
|
config->has_virtual_reserve = true; // todo: check if this true for NetBSD? (for anonymous mmap with PROT_NONE)
|
||||||
|
|
||||||
// disable transparent huge pages for this process?
|
// disable transparent huge pages for this process?
|
||||||
#if defined(MI_NO_THP) && (defined(__linux__) || defined(__ANDROID__))
|
#if (defined(__linux__) || defined(__ANDROID__)) && defined(PR_GET_THP_DISABLE)
|
||||||
|
#if defined(MI_NO_THP)
|
||||||
|
if (true)
|
||||||
|
#else
|
||||||
|
if (!mi_option_is_enabled(mi_option_allow_large_os_pages)) // disable THP also if large OS pages are not allowed in the options
|
||||||
|
#endif
|
||||||
|
{
|
||||||
int val = 0;
|
int val = 0;
|
||||||
if (prctl(PR_GET_THP_DISABLE, &val, 0, 0, 0) != 0) {
|
if (prctl(PR_GET_THP_DISABLE, &val, 0, 0, 0) != 0) {
|
||||||
// Most likely since distros often come with always/madvise settings.
|
// Most likely since distros often come with always/madvise settings.
|
||||||
@ -156,6 +162,7 @@ void _mi_prim_mem_init( mi_os_mem_config_t* config )
|
|||||||
// Disabling only for mimalloc process rather than touching system wide settings
|
// Disabling only for mimalloc process rather than touching system wide settings
|
||||||
(void)prctl(PR_SET_THP_DISABLE, &val, 0, 0, 0);
|
(void)prctl(PR_SET_THP_DISABLE, &val, 0, 0, 0);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user