Skip to content

Commit 2b91da7

Browse files
authored
gh-154044: Fix data race on descriptor __qualname__ in free-threading build (#154691)
1 parent 416c346 commit 2b91da7

2 files changed

Lines changed: 13 additions & 3 deletions

File tree

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix a data race on a descriptor's ``__qualname__`` cache in the
2+
:term:`free-threaded build`.

Objects/descrobject.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -621,9 +621,17 @@ static PyObject *
621621
descr_get_qualname(PyObject *self, void *Py_UNUSED(ignored))
622622
{
623623
PyDescrObject *descr = (PyDescrObject *)self;
624-
if (descr->d_qualname == NULL)
625-
descr->d_qualname = calculate_qualname(descr);
626-
return Py_XNewRef(descr->d_qualname);
624+
PyObject *qualname;
625+
Py_BEGIN_CRITICAL_SECTION(self);
626+
if (descr->d_qualname == NULL) {
627+
PyObject *new_qualname = calculate_qualname(descr);
628+
if (new_qualname != NULL) {
629+
Py_XSETREF(descr->d_qualname, new_qualname);
630+
}
631+
}
632+
qualname = Py_XNewRef(descr->d_qualname);
633+
Py_END_CRITICAL_SECTION();
634+
return qualname;
627635
}
628636

629637
static PyObject *

0 commit comments

Comments
 (0)