diff --git a/include/mimalloc.h b/include/mimalloc.h index f77c2ea1..7f09d1aa 100644 --- a/include/mimalloc.h +++ b/include/mimalloc.h @@ -164,6 +164,12 @@ mi_decl_export void mi_process_info(size_t* elapsed_msecs, size_t* user_msecs, s size_t* current_rss, size_t* peak_rss, size_t* current_commit, size_t* peak_commit, size_t* page_faults) mi_attr_noexcept; +typedef size_t mi_threadid_t; + +mi_decl_export mi_threadid_t mi_override_thread(mi_threadid_t override_id); +mi_decl_nodiscard mi_decl_export mi_threadid_t mi_thread_id(void); +mi_decl_export void mi_restore_default_thread_id(void); + // ------------------------------------------------------------------------------------- // Aligned allocation // Note that `alignment` always follows `size` for consistency with unaligned diff --git a/src/init.c b/src/init.c index b1db14c5..15d18371 100644 --- a/src/init.c +++ b/src/init.c @@ -136,10 +136,23 @@ mi_decl_cache_align static const mi_tld_t tld_empty = { { MI_STATS_NULL } // stats }; +mi_decl_thread mi_threadid_t _mi_override_thread_id = 0; +mi_decl_thread bool _mi_use_override_thread_id = false; mi_threadid_t _mi_thread_id(void) mi_attr_noexcept { + if (_mi_use_override_thread_id) + return _mi_override_thread_id; return _mi_prim_thread_id(); } +mi_threadid_t mi_override_thread(mi_threadid_t override_id) { + mi_threadid_t prev_id = _mi_thread_id(); + _mi_use_override_thread_id = true; + _mi_override_thread_id = override_id; + return prev_id; +} +void mi_restore_default_thread_id(void) { _mi_use_override_thread_id = false; } + +mi_threadid_t mi_thread_id(void) { return _mi_thread_id(); } // the thread-local default heap for allocation mi_decl_thread mi_heap_t* _mi_heap_default = (mi_heap_t*)&_mi_heap_empty;