mirror of
https://github.com/python/cpython.git
synced 2025-07-24 11:44:31 +00:00
gh-112529: Use GC heaps for GC allocations in free-threaded builds (gh-114157)
* 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
This commit is contained in:
parent
b1ad5a5d44
commit
1d6d5e854c
6 changed files with 85 additions and 7 deletions
13
Python/gc.c
13
Python/gc.c
|
@ -9,6 +9,7 @@
|
|||
#include "pycore_initconfig.h"
|
||||
#include "pycore_interp.h" // PyInterpreterState.gc
|
||||
#include "pycore_object.h"
|
||||
#include "pycore_object_alloc.h" // _PyObject_MallocWithType()
|
||||
#include "pycore_pyerrors.h"
|
||||
#include "pycore_pystate.h" // _PyThreadState_GET()
|
||||
#include "pycore_weakref.h" // _PyWeakref_ClearRef()
|
||||
|
@ -1795,14 +1796,14 @@ _Py_RunGC(PyThreadState *tstate)
|
|||
}
|
||||
|
||||
static PyObject *
|
||||
gc_alloc(size_t basicsize, size_t presize)
|
||||
gc_alloc(PyTypeObject *tp, size_t basicsize, size_t presize)
|
||||
{
|
||||
PyThreadState *tstate = _PyThreadState_GET();
|
||||
if (basicsize > PY_SSIZE_T_MAX - presize) {
|
||||
return _PyErr_NoMemory(tstate);
|
||||
}
|
||||
size_t size = presize + basicsize;
|
||||
char *mem = PyObject_Malloc(size);
|
||||
char *mem = _PyObject_MallocWithType(tp, size);
|
||||
if (mem == NULL) {
|
||||
return _PyErr_NoMemory(tstate);
|
||||
}
|
||||
|
@ -1817,7 +1818,7 @@ PyObject *
|
|||
_PyObject_GC_New(PyTypeObject *tp)
|
||||
{
|
||||
size_t presize = _PyType_PreHeaderSize(tp);
|
||||
PyObject *op = gc_alloc(_PyObject_SIZE(tp), presize);
|
||||
PyObject *op = gc_alloc(tp, _PyObject_SIZE(tp), presize);
|
||||
if (op == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
@ -1836,7 +1837,7 @@ _PyObject_GC_NewVar(PyTypeObject *tp, Py_ssize_t nitems)
|
|||
}
|
||||
size_t presize = _PyType_PreHeaderSize(tp);
|
||||
size_t size = _PyObject_VAR_SIZE(tp, nitems);
|
||||
op = (PyVarObject *)gc_alloc(size, presize);
|
||||
op = (PyVarObject *)gc_alloc(tp, size, presize);
|
||||
if (op == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
@ -1848,7 +1849,7 @@ PyObject *
|
|||
PyUnstable_Object_GC_NewWithExtraData(PyTypeObject *tp, size_t extra_size)
|
||||
{
|
||||
size_t presize = _PyType_PreHeaderSize(tp);
|
||||
PyObject *op = gc_alloc(_PyObject_SIZE(tp) + extra_size, presize);
|
||||
PyObject *op = gc_alloc(tp, _PyObject_SIZE(tp) + extra_size, presize);
|
||||
if (op == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
@ -1867,7 +1868,7 @@ _PyObject_GC_Resize(PyVarObject *op, Py_ssize_t nitems)
|
|||
return (PyVarObject *)PyErr_NoMemory();
|
||||
}
|
||||
char *mem = (char *)op - presize;
|
||||
mem = (char *)PyObject_Realloc(mem, presize + basicsize);
|
||||
mem = (char *)_PyObject_ReallocWithType(Py_TYPE(op), mem, presize + basicsize);
|
||||
if (mem == NULL) {
|
||||
return (PyVarObject *)PyErr_NoMemory();
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue