#ifndef Py_INTERNAL_MIMALLOC_H #define Py_INTERNAL_MIMALLOC_H #ifndef Py_BUILD_CORE # error "this header requires Py_BUILD_CORE define" #endif #if defined(MIMALLOC_H) || defined(MIMALLOC_TYPES_H) # error "pycore_mimalloc.h must be included before mimalloc.h" #endif typedef enum { _Py_MIMALLOC_HEAP_MEM = 0, // PyMem_Malloc() and friends _Py_MIMALLOC_HEAP_OBJECT = 1, // non-GC objects _Py_MIMALLOC_HEAP_GC = 2, // GC objects without pre-header _Py_MIMALLOC_HEAP_GC_PRE = 3, // GC objects with pre-header _Py_MIMALLOC_HEAP_COUNT } _Py_mimalloc_heap_id; #include "pycore_pymem.h" #ifdef WITH_MIMALLOC # ifdef Py_GIL_DISABLED # define MI_PRIM_THREAD_ID _Py_ThreadId # endif # define MI_DEBUG_UNINIT PYMEM_CLEANBYTE # define MI_DEBUG_FREED PYMEM_DEADBYTE # define MI_DEBUG_PADDING PYMEM_FORBIDDENBYTE #ifdef Py_DEBUG # define MI_DEBUG 2 #else # define MI_DEBUG 0 #endif #ifdef _Py_THREAD_SANITIZER # define MI_TSAN 1 #endif #ifdef __cplusplus extern "C++" { #endif #include "mimalloc/mimalloc.h" #include "mimalloc/mimalloc/types.h" #include "mimalloc/mimalloc/internal.h" #ifdef __cplusplus } #endif #endif #ifdef Py_GIL_DISABLED struct _mimalloc_interp_state { // When exiting, threads place any segments with live blocks in this // shared pool for other threads to claim and reuse. mi_abandoned_pool_t abandoned_pool; }; struct _mimalloc_thread_state { mi_heap_t *current_object_heap; mi_heap_t heaps[_Py_MIMALLOC_HEAP_COUNT]; mi_tld_t tld; int initialized; struct llist_node page_list; }; #endif #endif // Py_INTERNAL_MIMALLOC_H