mirror of
https://github.com/python/cpython.git
synced 2025-12-23 09:19:18 +00:00
[3.12] gh-107080: Fix Py_TRACE_REFS Crashes Under Isolated Subinterpreters (#107751)
* Unrevert "[3.12] gh-107080: Fix Py_TRACE_REFS Crashes Under Isolated Subinterpreters (gh-107567) (#107599)".
This reverts commit 6e4eec7606 (gh-107648).
* Initialize each interpreter's refchain properly.
* Skip test_basic_multiple_interpreters_deleted_no_reset on tracerefs builds.
This commit is contained in:
parent
bd2ef82a50
commit
aa9707dda9
8 changed files with 93 additions and 30 deletions
|
|
@ -152,6 +152,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
|
||||
|
|
@ -271,8 +272,8 @@ extern void _PyDebug_PrintTotalRefs(void);
|
|||
|
||||
#ifdef Py_TRACE_REFS
|
||||
extern void _Py_AddToAllObjects(PyObject *op, int force);
|
||||
extern void _Py_PrintReferences(FILE *);
|
||||
extern void _Py_PrintReferenceAddresses(FILE *);
|
||||
extern void _Py_PrintReferences(PyInterpreterState *, FILE *);
|
||||
extern void _Py_PrintReferenceAddresses(PyInterpreterState *, FILE *);
|
||||
#endif
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -11,17 +11,22 @@ extern "C" {
|
|||
struct _py_object_runtime_state {
|
||||
#ifdef Py_REF_DEBUG
|
||||
Py_ssize_t interpreter_leaks;
|
||||
#else
|
||||
int _not_used;
|
||||
#endif
|
||||
int _not_used;
|
||||
};
|
||||
|
||||
struct _py_object_state {
|
||||
#ifdef Py_REF_DEBUG
|
||||
Py_ssize_t reftotal;
|
||||
#else
|
||||
int _not_used;
|
||||
#endif
|
||||
#ifdef Py_TRACE_REFS
|
||||
/* Head of circular doubly-linked list of all objects. These are linked
|
||||
* together via the _ob_prev and _ob_next members of a PyObject, which
|
||||
* exist only in a Py_TRACE_REFS build.
|
||||
*/
|
||||
PyObject refchain;
|
||||
#endif
|
||||
int _not_used;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -101,6 +101,7 @@ extern PyTypeObject _PyExc_MemoryError;
|
|||
{ .threshold = 10, }, \
|
||||
}, \
|
||||
}, \
|
||||
.object_state = _py_object_state_INIT(INTERP), \
|
||||
.dtoa = _dtoa_state_INIT(&(INTERP)), \
|
||||
.dict_state = _dict_state_INIT, \
|
||||
.func_state = { \
|
||||
|
|
@ -130,6 +131,16 @@ extern PyTypeObject _PyExc_MemoryError;
|
|||
.context_ver = 1, \
|
||||
}
|
||||
|
||||
#ifdef Py_TRACE_REFS
|
||||
# define _py_object_state_INIT(INTERP) \
|
||||
{ \
|
||||
.refchain = {&INTERP.object_state.refchain, &INTERP.object_state.refchain}, \
|
||||
}
|
||||
#else
|
||||
# define _py_object_state_INIT(INTERP) \
|
||||
{ 0 }
|
||||
#endif
|
||||
|
||||
|
||||
// global objects
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue