Skip to content

Commit be87675

Browse files
Clear weakref sentinel in the right place
1 parent 987f6a3 commit be87675

File tree

3 files changed

+10
-2
lines changed

3 files changed

+10
-2
lines changed

Objects/weakrefobject.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1280,6 +1280,12 @@ void
12801280
_PyWeakref_ClearSubclassSentinel(PyInterpreterState *interp)
12811281
{
12821282
if (interp == interp->runtime->interpreters.main) {
1283+
PyObject *func = _Py_INTERP_SINGLETON(interp, subclasses_weakref_sentinel);
1284+
1285+
assert(PyObject_GC_IsTracked(func) == 0);
1286+
_Py_SetMortal(_Py_INTERP_SINGLETON(interp, subclasses_weakref_sentinel), 1);
1287+
PyObject_GC_Track(func);
1288+
12831289
Py_CLEAR(_Py_INTERP_SINGLETON(interp, subclasses_weakref_sentinel));
12841290
}
12851291
}

Python/pylifecycle.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1876,6 +1876,10 @@ finalize_interp_types(PyInterpreterState *interp)
18761876
_PyObject_FinalizeUniqueIdPool(interp);
18771877
#endif
18781878

1879+
// We clear subclass sentinel here because some weakrefs may
1880+
// hold reference to it (for example, type's subclasses)
1881+
_PyWeakref_ClearSubclassSentinel(interp);
1882+
18791883
_PyCode_Fini(interp);
18801884

18811885
// Call _PyUnicode_ClearInterned() before _PyDict_Fini() since it uses

Python/pystate.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -761,8 +761,6 @@ interpreter_clear(PyInterpreterState *interp, PyThreadState *tstate)
761761

762762
Py_CLEAR(interp->audit_hooks);
763763

764-
_PyWeakref_ClearSubclassSentinel(interp);
765-
766764
// At this time, all the threads should be cleared so we don't need atomic
767765
// operations for instrumentation_version or eval_breaker.
768766
interp->ceval.instrumentation_version = 0;

0 commit comments

Comments
 (0)