mirror of https://github.com/python/cpython
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:
parent
954d616b4c
commit
027fa2eccf
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue