https://github.com/python/cpython/commit/0b65c88c2af6e09530a9aa21800771aa687371db
commit: 0b65c88c2af6e09530a9aa21800771aa687371db
branch: main
author: Sam Gross <[email protected]>
committer: colesbury <[email protected]>
date: 2026-03-09T18:41:07-04:00
summary:
gh-145685: Stop the world when updating MRO of existing types (gh-145707)
We already have a stop-the-world pause elsewhere in this code path
(type_set_bases) and this makes will make it easier to avoid contention
on the TYPE_LOCK when looking up names in the MRO hierarchy.
Also use deferred reference counting for non-immortal MROs.
files:
M Objects/typeobject.c
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index 27ec8bb40a929f..81abb0990eebe9 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -647,7 +647,6 @@ clear_tp_bases(PyTypeObject *self, int final)
static inline PyObject *
lookup_tp_mro(PyTypeObject *self)
{
- ASSERT_NEW_TYPE_OR_LOCKED(self);
return self->tp_mro;
}
@@ -664,8 +663,19 @@ set_tp_mro(PyTypeObject *self, PyObject *mro, int initial)
/* Other checks are done via set_tp_bases. */
_Py_SetImmortal(mro);
}
+ else {
+ PyUnstable_Object_EnableDeferredRefcount(mro);
+ }
+ }
+ if (!initial) {
+ type_lock_prevent_release();
+ types_stop_world();
}
self->tp_mro = mro;
+ if (!initial) {
+ types_start_world();
+ type_lock_allow_release();
+ }
}
static inline void
@@ -1728,18 +1738,11 @@ static PyObject *
type_get_mro(PyObject *tp, void *Py_UNUSED(closure))
{
PyTypeObject *type = PyTypeObject_CAST(tp);
- PyObject *mro;
-
- BEGIN_TYPE_LOCK();
- mro = lookup_tp_mro(type);
+ PyObject *mro = lookup_tp_mro(type);
if (mro == NULL) {
- mro = Py_None;
- } else {
- Py_INCREF(mro);
+ Py_RETURN_NONE;
}
-
- END_TYPE_LOCK();
- return mro;
+ return Py_NewRef(mro);
}
static PyTypeObject *find_best_base(PyObject *);
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]