diff --git a/include/mimalloc-internal.h b/include/mimalloc-internal.h index 0ecc3057..51c4cfc9 100644 --- a/include/mimalloc-internal.h +++ b/include/mimalloc-internal.h @@ -82,6 +82,7 @@ void* _mi_os_alloc(size_t size, mi_stats_t* stats); // to allocat void _mi_os_free(void* p, size_t size, mi_stats_t* stats); // to free thread local data size_t _mi_os_good_alloc_size(size_t size); bool _mi_os_has_overcommit(void); +bool _mi_os_alloc_named(void* p, size_t size, const char *name); void* _mi_os_alloc_aligned_offset(size_t size, size_t alignment, size_t align_offset, bool commit, bool* large, mi_stats_t* tld_stats); void _mi_os_free_aligned(void* p, size_t size, size_t alignment, size_t align_offset, bool was_committed, mi_stats_t* tld_stats); diff --git a/include/mimalloc.h b/include/mimalloc.h index 1fc10b2a..7d8e67ba 100644 --- a/include/mimalloc.h +++ b/include/mimalloc.h @@ -394,6 +394,8 @@ mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_new_n(size_t count, s mi_decl_nodiscard mi_decl_export void* mi_new_realloc(void* p, size_t newsize) mi_attr_alloc_size(2); mi_decl_nodiscard mi_decl_export void* mi_new_reallocn(void* p, size_t newcount, size_t size) mi_attr_alloc_size2(2, 3); +mi_decl_export bool mi_alloc_named(void* p, size_t size, const char *name); + #ifdef __cplusplus } #endif diff --git a/src/os.c b/src/os.c index c2d53e5b..6643c9db 100644 --- a/src/os.c +++ b/src/os.c @@ -45,6 +45,7 @@ terms of the MIT license. A copy of the license can be found in the file #else #include #endif +#include #endif #if defined(__APPLE__) #include @@ -1483,3 +1484,20 @@ int _mi_os_numa_node_get(mi_os_tld_t* tld) { if (numa_node >= numa_count) { numa_node = numa_node % numa_count; } return (int)numa_node; } + +bool _mi_os_alloc_named(void* p, size_t size, const char *name) { + mi_assert_internal(p != NULL); + mi_assert_internal(name != NULL); +#if defined(__linux__) +#if !defined(PR_SET_VMA) +#define PR_SET_VMA 0x53564d41 +#define PR_SET_VMA_ANON_NAME 0 +#endif + return (prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, (unsigned long)p, size, (unsigned long)name) == 0); +#else + MI_UNUSED(p); + MI_UNUSED(size); + MI_UNUSED(name); + return false; +#endif +} diff --git a/src/page.c b/src/page.c index 7c3a30a8..af1c7dbd 100644 --- a/src/page.c +++ b/src/page.c @@ -893,3 +893,7 @@ void* _mi_malloc_generic(mi_heap_t* heap, size_t size, bool zero, size_t huge_al return _mi_page_malloc(heap, page, size, zero); } } + +bool mi_alloc_named(void* p, size_t size, const char *name) { + return _mi_os_alloc_named(p, size, name); +} diff --git a/src/region.c b/src/region.c index f069502f..7e4ce57f 100644 --- a/src/region.c +++ b/src/region.c @@ -163,7 +163,6 @@ static bool mi_memid_is_arena(size_t id, mem_region_t** region, mi_bitmap_index_ } } - /* ---------------------------------------------------------------------------- Allocate a region is allocated from the OS (or an arena) -----------------------------------------------------------------------------*/