summaryrefslogtreecommitdiffstats
path: root/Modules/_testinternalcapi.c
diff options
context:
space:
mode:
authorSam Gross <colesbury@gmail.com>2024-02-01 20:29:19 (GMT)
committerGitHub <noreply@github.com>2024-02-01 20:29:19 (GMT)
commit587d4802034749e2aace9c00b00bd73eccdae1e7 (patch)
treeba760dcffd508c28bb8ed42930bd7fba009dd38a /Modules/_testinternalcapi.c
parent500ede01178a8063bb2a3c664172dffa1b40d7c9 (diff)
downloadcpython-587d4802034749e2aace9c00b00bd73eccdae1e7.zip
cpython-587d4802034749e2aace9c00b00bd73eccdae1e7.tar.gz
cpython-587d4802034749e2aace9c00b00bd73eccdae1e7.tar.bz2
gh-112529: Remove PyGC_Head from object pre-header in free-threaded build (#114564)
* gh-112529: Remove PyGC_Head from object pre-header in free-threaded build This avoids allocating space for PyGC_Head in the free-threaded build. The GC implementation for free-threaded CPython does not use the PyGC_Head structure. * The trashcan mechanism uses the `ob_tid` field instead of `_gc_prev` in the free-threaded build. * The GDB libpython.py file now determines the offset of the managed dict field based on whether the running process is a free-threaded build. Those are identified by the `ob_ref_local` field in PyObject. * Fixes `_PySys_GetSizeOf()` which incorrectly incorrectly included the size of `PyGC_Head` in the size of static `PyTypeObject`.
Diffstat (limited to 'Modules/_testinternalcapi.c')
-rw-r--r--Modules/_testinternalcapi.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/Modules/_testinternalcapi.c b/Modules/_testinternalcapi.c
index c4a648a..0bb739b 100644
--- a/Modules/_testinternalcapi.c
+++ b/Modules/_testinternalcapi.c
@@ -1752,8 +1752,18 @@ module_exec(PyObject *module)
return 1;
}
+ Py_ssize_t sizeof_gc_head = 0;
+#ifndef Py_GIL_DISABLED
+ sizeof_gc_head = sizeof(PyGC_Head);
+#endif
+
if (PyModule_Add(module, "SIZEOF_PYGC_HEAD",
- PyLong_FromSsize_t(sizeof(PyGC_Head))) < 0) {
+ PyLong_FromSsize_t(sizeof_gc_head)) < 0) {
+ return 1;
+ }
+
+ if (PyModule_Add(module, "SIZEOF_MANAGED_PRE_HEADER",
+ PyLong_FromSsize_t(2 * sizeof(PyObject*))) < 0) {
return 1;
}