summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Snow <ericsnowcurrently@gmail.com>2023-08-07 19:14:56 (GMT)
committerGitHub <noreply@github.com>2023-08-07 19:14:56 (GMT)
commit430632d6f710c99879c5d1736f3b40ea09b11c4d (patch)
tree5c170b5a94186d7703e353837fbfcc1b2b8ec47b
parent16c9415fba4972743f1944ebc44946e475e68bc4 (diff)
downloadcpython-430632d6f710c99879c5d1736f3b40ea09b11c4d.zip
cpython-430632d6f710c99879c5d1736f3b40ea09b11c4d.tar.gz
cpython-430632d6f710c99879c5d1736f3b40ea09b11c4d.tar.bz2
gh-107630: Initialize Each Interpreter's refchain Properly (gh-107733)
This finishes fixing the crashes in Py_TRACE_REFS builds. We missed this part in gh-107567.
-rw-r--r--Include/internal/pycore_object.h1
-rw-r--r--Objects/object.c22
-rw-r--r--Python/pylifecycle.c2
-rw-r--r--Python/pystate.c1
4 files changed, 25 insertions, 1 deletions
diff --git a/Include/internal/pycore_object.h b/Include/internal/pycore_object.h
index 76b3cd6..7cdf64b 100644
--- a/Include/internal/pycore_object.h
+++ b/Include/internal/pycore_object.h
@@ -173,6 +173,7 @@ _PyType_HasFeature(PyTypeObject *type, unsigned long feature) {
extern void _PyType_InitCache(PyInterpreterState *interp);
+extern void _PyObject_InitState(PyInterpreterState *interp);
/* Inline functions trading binary compatibility for speed:
_PyObject_Init() is the fast version of PyObject_Init(), and
diff --git a/Objects/object.c b/Objects/object.c
index c4413a0..d1154eb 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -162,6 +162,14 @@ _PyDebug_PrintTotalRefs(void) {
#define REFCHAIN(interp) &interp->object_state.refchain
+static inline void
+init_refchain(PyInterpreterState *interp)
+{
+ PyObject *refchain = REFCHAIN(interp);
+ refchain->_ob_prev = refchain;
+ refchain->_ob_next = refchain;
+}
+
/* Insert op at the front of the list of all objects. If force is true,
* op is added even if _ob_prev and _ob_next are non-NULL already. If
* force is false amd _ob_prev or _ob_next are non-NULL, do nothing.
@@ -2019,6 +2027,18 @@ PyObject _Py_NotImplementedStruct = {
&_PyNotImplemented_Type
};
+
+void
+_PyObject_InitState(PyInterpreterState *interp)
+{
+#ifdef Py_TRACE_REFS
+ if (!_Py_IsMainInterpreter(interp)) {
+ init_refchain(interp);
+ }
+#endif
+}
+
+
extern PyTypeObject _Py_GenericAliasIterType;
extern PyTypeObject _PyMemoryIter_Type;
extern PyTypeObject _PyLineIterator;
@@ -2326,7 +2346,7 @@ _Py_GetObjects(PyObject *self, PyObject *args)
#undef REFCHAIN
-#endif
+#endif /* Py_TRACE_REFS */
/* Hack to force loading of abstract.o */
diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
index 7a17f92..0de3abf 100644
--- a/Python/pylifecycle.c
+++ b/Python/pylifecycle.c
@@ -2075,6 +2075,8 @@ new_interpreter(PyThreadState **tstate_p, const PyInterpreterConfig *config)
}
has_gil = 1;
+ /* No objects have been created yet. */
+
status = pycore_interp_init(tstate);
if (_PyStatus_EXCEPTION(status)) {
goto error;
diff --git a/Python/pystate.c b/Python/pystate.c
index a1864cc..3a05cb0 100644
--- a/Python/pystate.c
+++ b/Python/pystate.c
@@ -674,6 +674,7 @@ init_interpreter(PyInterpreterState *interp,
_obmalloc_pools_INIT(interp->obmalloc.pools);
memcpy(&interp->obmalloc.pools.used, temp, sizeof(temp));
}
+ _PyObject_InitState(interp);
_PyEval_InitState(interp, pending_lock);
_PyGC_InitState(&interp->gc);