mirror of https://github.com/python/cpython
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
|