Skip to content

Commit a2776fb

Browse files
fix some races
1 parent 9ced5c4 commit a2776fb

2 files changed

Lines changed: 19 additions & 1 deletion

File tree

Lib/test/test_free_threading/test_type.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,20 @@ class ClassB(Base):
127127
obj.__class__ = ClassB
128128

129129

130+
def test_name_change(self):
131+
class Foo:
132+
pass
133+
134+
def writer():
135+
for _ in range(1000):
136+
Foo.__name__ = 'Bar'
137+
138+
def reader():
139+
for _ in range(1000):
140+
self.assertEqual(Foo.__name__, 'Bar')
141+
142+
self.run_one(writer, reader)
143+
130144
def run_one(self, writer_func, reader_func):
131145
barrier = threading.Barrier(NTHREADS)
132146

Objects/typeobject.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1535,9 +1535,11 @@ type_set_name(PyObject *tp, PyObject *value, void *Py_UNUSED(closure))
15351535
return -1;
15361536
}
15371537

1538+
PyInterpreterState *interp = _PyInterpreterState_GET();
1539+
_PyEval_StopTheWorld(interp);
15381540
type->tp_name = tp_name;
15391541
Py_SETREF(((PyHeapTypeObject*)type)->ht_name, Py_NewRef(value));
1540-
1542+
_PyEval_StartTheWorld(interp);
15411543
return 0;
15421544
}
15431545

@@ -10706,9 +10708,11 @@ slot_tp_descr_get(PyObject *self, PyObject *obj, PyObject *type)
1070610708

1070710709
get = _PyType_LookupRef(tp, &_Py_ID(__get__));
1070810710
if (get == NULL) {
10711+
#ifndef Py_GIL_DISABLED
1070910712
/* Avoid further slowdowns */
1071010713
if (tp->tp_descr_get == slot_tp_descr_get)
1071110714
tp->tp_descr_get = NULL;
10715+
#endif
1071210716
return Py_NewRef(self);
1071310717
}
1071410718
if (obj == NULL)

0 commit comments

Comments
 (0)