obj.__class__ = ClassB
+ def test_name_change(self):
+ class Foo:
+ pass
+
+ def writer():
+ for _ in range(1000):
+ Foo.__name__ = 'Bar'
+
+ def reader():
+ for _ in range(1000):
+ Foo.__name__
+
+ self.run_one(writer, reader)
+
def run_one(self, writer_func, reader_func):
barrier = threading.Barrier(NTHREADS)
return -1;
}
+ PyInterpreterState *interp = _PyInterpreterState_GET();
+ _PyEval_StopTheWorld(interp);
type->tp_name = tp_name;
- Py_SETREF(((PyHeapTypeObject*)type)->ht_name, Py_NewRef(value));
-
+ PyObject *old_name = ((PyHeapTypeObject*)type)->ht_name;
+ ((PyHeapTypeObject*)type)->ht_name = Py_NewRef(value);
+ _PyEval_StartTheWorld(interp);
+ Py_DECREF(old_name);
return 0;
}
get = _PyType_LookupRef(tp, &_Py_ID(__get__));
if (get == NULL) {
+#ifndef Py_GIL_DISABLED
/* Avoid further slowdowns */
if (tp->tp_descr_get == slot_tp_descr_get)
tp->tp_descr_get = NULL;
+#endif
return Py_NewRef(self);
}
if (obj == NULL)
# gh-133467. Some of these could be hard to trigger.
race_top:_Py_slot_tp_getattr_hook
-race_top:slot_tp_descr_get
-race_top:type_set_name
race_top:set_tp_bases
race_top:type_set_bases_unlocked