mirror of
https://github.com/microsoft/mimalloc.git
synced 2025-05-07 15:59:32 +03:00
Merge branch 'dev' into dev2
This commit is contained in:
commit
39e16518a3
4 changed files with 15 additions and 12 deletions
|
@ -282,8 +282,8 @@
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="mimalloc-lib.vcxproj">
|
<ProjectReference Include="mimalloc-override-dll.vcxproj">
|
||||||
<Project>{abb5eae7-b3e6-432e-b636-333449892ea6}</Project>
|
<Project>{abb5eae7-b3e6-432e-b636-333449892ea7}</Project>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
|
|
@ -96,7 +96,7 @@ uintptr_t _mi_os_random_weak(uintptr_t extra_seed);
|
||||||
static inline uintptr_t _mi_random_shuffle(uintptr_t x);
|
static inline uintptr_t _mi_random_shuffle(uintptr_t x);
|
||||||
|
|
||||||
// init.c
|
// init.c
|
||||||
extern mi_decl_cache_align mi_stats_t _mi_stats_main;
|
extern mi_decl_hidden mi_decl_cache_align mi_stats_t _mi_stats_main;
|
||||||
extern mi_decl_hidden mi_decl_cache_align const mi_page_t _mi_page_empty;
|
extern mi_decl_hidden mi_decl_cache_align const mi_page_t _mi_page_empty;
|
||||||
void _mi_process_load(void);
|
void _mi_process_load(void);
|
||||||
void mi_cdecl _mi_process_done(void);
|
void mi_cdecl _mi_process_done(void);
|
||||||
|
@ -1041,8 +1041,8 @@ static inline size_t mi_popcount(size_t x) {
|
||||||
|
|
||||||
#if !MI_TRACK_ENABLED && defined(_WIN32) && (defined(_M_IX86) || defined(_M_X64))
|
#if !MI_TRACK_ENABLED && defined(_WIN32) && (defined(_M_IX86) || defined(_M_X64))
|
||||||
#include <intrin.h>
|
#include <intrin.h>
|
||||||
extern bool _mi_cpu_has_fsrm;
|
extern mi_decl_hidden bool _mi_cpu_has_fsrm;
|
||||||
extern bool _mi_cpu_has_erms;
|
extern mi_decl_hidden bool _mi_cpu_has_erms;
|
||||||
static inline void _mi_memcpy(void* dst, const void* src, size_t n) {
|
static inline void _mi_memcpy(void* dst, const void* src, size_t n) {
|
||||||
if ((_mi_cpu_has_fsrm && n <= 128) || (_mi_cpu_has_erms && n > 128)) {
|
if ((_mi_cpu_has_fsrm && n <= 128) || (_mi_cpu_has_erms && n > 128)) {
|
||||||
__movsb((unsigned char*)dst, (const unsigned char*)src, n);
|
__movsb((unsigned char*)dst, (const unsigned char*)src, n);
|
||||||
|
|
|
@ -208,7 +208,7 @@ static inline void mi_prim_tls_slot_set(size_t slot, void* value) mi_attr_noexce
|
||||||
#elif _WIN32 && MI_WIN_USE_FIXED_TLS && !defined(MI_WIN_USE_FLS)
|
#elif _WIN32 && MI_WIN_USE_FIXED_TLS && !defined(MI_WIN_USE_FLS)
|
||||||
|
|
||||||
// On windows we can store the thread-local heap at a fixed TLS slot to avoid
|
// On windows we can store the thread-local heap at a fixed TLS slot to avoid
|
||||||
// thread-local initialization checks in the fast path.
|
// thread-local initialization checks in the fast path.
|
||||||
// We always use the second user TLS slot (the first one is always allocated already),
|
// We always use the second user TLS slot (the first one is always allocated already),
|
||||||
// and at initialization (`windows/prim.c`) we call TlsAlloc and verify
|
// and at initialization (`windows/prim.c`) we call TlsAlloc and verify
|
||||||
// we indeed get the second slot (and fail otherwise).
|
// we indeed get the second slot (and fail otherwise).
|
||||||
|
@ -270,8 +270,11 @@ static inline void mi_prim_tls_slot_set(size_t slot, void* value) mi_attr_noexce
|
||||||
|
|
||||||
|
|
||||||
// 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
|
#ifdef _MSC_VER
|
||||||
extern bool _mi_process_is_initialized; // has mi_process_init been called?
|
__declspec(selectany) // make it part of the comdat section to have faster TLS access (issue #1078)
|
||||||
|
#endif
|
||||||
|
extern mi_decl_hidden mi_decl_thread mi_heap_t* _mi_heap_default; // default heap to allocate from
|
||||||
|
extern mi_decl_hidden 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;
|
||||||
|
|
||||||
|
@ -399,7 +402,7 @@ static inline mi_heap_t* mi_prim_get_default_heap(void) {
|
||||||
|
|
||||||
#elif defined(MI_TLS_PTHREAD)
|
#elif defined(MI_TLS_PTHREAD)
|
||||||
|
|
||||||
extern pthread_key_t _mi_heap_default_key;
|
extern mi_decl_hidden pthread_key_t _mi_heap_default_key;
|
||||||
static inline mi_heap_t* mi_prim_get_default_heap(void) {
|
static inline mi_heap_t* mi_prim_get_default_heap(void) {
|
||||||
mi_heap_t* heap = (mi_unlikely(_mi_heap_default_key == (pthread_key_t)(-1)) ? _mi_heap_main_get() : (mi_heap_t*)pthread_getspecific(_mi_heap_default_key));
|
mi_heap_t* heap = (mi_unlikely(_mi_heap_default_key == (pthread_key_t)(-1)) ? _mi_heap_main_get() : (mi_heap_t*)pthread_getspecific(_mi_heap_default_key));
|
||||||
return (mi_unlikely(heap == NULL) ? (mi_heap_t*)&_mi_heap_empty : heap);
|
return (mi_unlikely(heap == NULL) ? (mi_heap_t*)&_mi_heap_empty : heap);
|
||||||
|
|
|
@ -112,7 +112,7 @@ static bool mi_page_is_valid_init(mi_page_t* page) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern bool _mi_process_is_initialized; // has mi_process_init been called?
|
extern mi_decl_hidden bool _mi_process_is_initialized; // has mi_process_init been called?
|
||||||
|
|
||||||
bool _mi_page_is_valid(mi_page_t* page) {
|
bool _mi_page_is_valid(mi_page_t* page) {
|
||||||
mi_assert_internal(mi_page_is_valid_init(page));
|
mi_assert_internal(mi_page_is_valid_init(page));
|
||||||
|
@ -998,9 +998,9 @@ void* _mi_malloc_generic(mi_heap_t* heap, size_t size, bool zero, size_t huge_al
|
||||||
|
|
||||||
// free delayed frees from other threads (but skip contended ones)
|
// free delayed frees from other threads (but skip contended ones)
|
||||||
_mi_heap_delayed_free_partial(heap);
|
_mi_heap_delayed_free_partial(heap);
|
||||||
|
|
||||||
// collect every once in a while (10000 by default)
|
// collect every once in a while (10000 by default)
|
||||||
const long generic_collect = mi_option_get_clamp(mi_option_generic_collect, 1, 1000000L);
|
const long generic_collect = mi_option_get_clamp(mi_option_generic_collect, 1, 1000000L);
|
||||||
if (heap->generic_collect_count >= generic_collect) {
|
if (heap->generic_collect_count >= generic_collect) {
|
||||||
heap->generic_collect_count = 0;
|
heap->generic_collect_count = 0;
|
||||||
mi_heap_collect(heap, false /* force? */);
|
mi_heap_collect(heap, false /* force? */);
|
||||||
|
|
Loading…
Add table
Reference in a new issue