summaryrefslogtreecommitdiffstats
path: root/Python/gc.c
diff options
context:
space:
mode:
authorSam Gross <colesbury@gmail.com>2024-01-20 16:14:45 (GMT)
committerGitHub <noreply@github.com>2024-01-20 16:14:45 (GMT)
commit1d6d5e854c375821a64fa9c2fbb04a36fb3b9aaa (patch)
tree4bd78a9aca8990260d29c54202249936b685a5c6 /Python/gc.c
parentb1ad5a5d446f944a45c43a3e865d1d8f47611071 (diff)
downloadcpython-1d6d5e854c375821a64fa9c2fbb04a36fb3b9aaa.zip
cpython-1d6d5e854c375821a64fa9c2fbb04a36fb3b9aaa.tar.gz
cpython-1d6d5e854c375821a64fa9c2fbb04a36fb3b9aaa.tar.bz2
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
Diffstat (limited to 'Python/gc.c')
-rw-r--r--Python/gc.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/Python/gc.c b/Python/gc.c
index 9f9a755..1487050 100644
--- a/Python/gc.c
+++ b/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();
}