mirror of
https://github.com/python/cpython.git
synced 2024-11-24 10:24:35 +08:00
1d6d5e854c
* 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
72 lines
2.1 KiB
C
72 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
|