gh-112087: Make `list.extend(dict)` behave atomically (#117438)

Add a special case for `list.extend(dict)` and `list(dict)` so that those
patterns behave atomically with respect to modifications to the list or
dictionary.

This is required by multiprocessing, which assumes that
`list(_finalizer_registry)` is atomic.
This commit is contained in:
Sam Gross 2024-04-02 10:45:00 -04:00 committed by GitHub
parent 954d616b4c
commit 027fa2eccf
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 5 additions and 0 deletions

View File

@ -1374,6 +1374,11 @@ _list_extend(PyListObject *self, PyObject *iterable)
res = list_extend_set(self, (PySetObject *)iterable); res = list_extend_set(self, (PySetObject *)iterable);
Py_END_CRITICAL_SECTION2(); Py_END_CRITICAL_SECTION2();
} }
else if (PyDict_CheckExact(iterable)) {
Py_BEGIN_CRITICAL_SECTION2(self, iterable);
res = list_extend_dict(self, (PyDictObject *)iterable, 0 /*keys*/);
Py_END_CRITICAL_SECTION2();
}
else if (Py_IS_TYPE(iterable, &PyDictKeys_Type)) { else if (Py_IS_TYPE(iterable, &PyDictKeys_Type)) {
PyDictObject *dict = ((_PyDictViewObject *)iterable)->dv_dict; PyDictObject *dict = ((_PyDictViewObject *)iterable)->dv_dict;
Py_BEGIN_CRITICAL_SECTION2(self, dict); Py_BEGIN_CRITICAL_SECTION2(self, dict);