mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 11:49:12 +00:00 
			
		
		
		
	* gh-112529: Use GC heaps for GC allocations in free-threaded builds The free-threaded build's garbage collector implementation will need to find GC objects by traversing mimalloc heaps. This hooks up the allocation calls with the correct heaps by using a thread-local "current_obj_heap" variable. * Refactor out setting heap based on type
		
			
				
	
	
		
			71 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#ifndef Py_INTERNAL_OBJECT_ALLOC_H
 | 
						|
#define Py_INTERNAL_OBJECT_ALLOC_H
 | 
						|
 | 
						|
#include "pycore_object.h"      // _PyType_HasFeature()
 | 
						|
#include "pycore_pystate.h"     // _PyThreadState_GET()
 | 
						|
#include "pycore_tstate.h"      // _PyThreadStateImpl
 | 
						|
 | 
						|
#ifdef __cplusplus
 | 
						|
extern "C" {
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef Py_BUILD_CORE
 | 
						|
#  error "this header requires Py_BUILD_CORE define"
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef Py_GIL_DISABLED
 | 
						|
static inline mi_heap_t *
 | 
						|
_PyObject_GetAllocationHeap(_PyThreadStateImpl *tstate, PyTypeObject *tp)
 | 
						|
{
 | 
						|
    struct _mimalloc_thread_state *m = &tstate->mimalloc;
 | 
						|
    if (_PyType_HasFeature(tp, Py_TPFLAGS_PREHEADER)) {
 | 
						|
        return &m->heaps[_Py_MIMALLOC_HEAP_GC_PRE];
 | 
						|
    }
 | 
						|
    else if (_PyType_IS_GC(tp)) {
 | 
						|
        return &m->heaps[_Py_MIMALLOC_HEAP_GC];
 | 
						|
    }
 | 
						|
    else {
 | 
						|
        return &m->heaps[_Py_MIMALLOC_HEAP_OBJECT];
 | 
						|
    }
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
// Sets the heap used for PyObject_Malloc(), PyObject_Realloc(), etc. calls in
 | 
						|
// Py_GIL_DISABLED builds. We use different heaps depending on if the object
 | 
						|
// supports GC and if it has a pre-header. We smuggle the choice of heap
 | 
						|
// through the _mimalloc_thread_state. In the default build, this simply
 | 
						|
// calls PyObject_Malloc().
 | 
						|
static inline void *
 | 
						|
_PyObject_MallocWithType(PyTypeObject *tp, size_t size)
 | 
						|
{
 | 
						|
#ifdef Py_GIL_DISABLED
 | 
						|
    _PyThreadStateImpl *tstate = (_PyThreadStateImpl *)_PyThreadState_GET();
 | 
						|
    struct _mimalloc_thread_state *m = &tstate->mimalloc;
 | 
						|
    m->current_object_heap = _PyObject_GetAllocationHeap(tstate, tp);
 | 
						|
#endif
 | 
						|
    void *mem = PyObject_Malloc(size);
 | 
						|
#ifdef Py_GIL_DISABLED
 | 
						|
    m->current_object_heap = &m->heaps[_Py_MIMALLOC_HEAP_OBJECT];
 | 
						|
#endif
 | 
						|
    return mem;
 | 
						|
}
 | 
						|
 | 
						|
static inline void *
 | 
						|
_PyObject_ReallocWithType(PyTypeObject *tp, void *ptr, size_t size)
 | 
						|
{
 | 
						|
#ifdef Py_GIL_DISABLED
 | 
						|
    _PyThreadStateImpl *tstate = (_PyThreadStateImpl *)_PyThreadState_GET();
 | 
						|
    struct _mimalloc_thread_state *m = &tstate->mimalloc;
 | 
						|
    m->current_object_heap = _PyObject_GetAllocationHeap(tstate, tp);
 | 
						|
#endif
 | 
						|
    void *mem = PyObject_Realloc(ptr, size);
 | 
						|
#ifdef Py_GIL_DISABLED
 | 
						|
    m->current_object_heap = &m->heaps[_Py_MIMALLOC_HEAP_OBJECT];
 | 
						|
#endif
 | 
						|
    return mem;
 | 
						|
}
 | 
						|
 | 
						|
#ifdef __cplusplus
 | 
						|
}
 | 
						|
#endif
 | 
						|
#endif  // !Py_INTERNAL_OBJECT_ALLOC_H
 |