-
-
Notifications
You must be signed in to change notification settings - Fork 32.6k
Closed
Labels
3.13bugs and security fixesbugs and security fixes3.14bugs and security fixesbugs and security fixestopic-free-threadingtype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
Description
Bug report
PyDict_Next
currently wraps _PyDict_Next
in a critical section. We shouldn't do this -- the locking needs to be external to the call.
- It's not sufficient to lock the dict just for each
_PyDict_Next
call because we return borrowed references and becausepos
becomes meaningless if the dictionary gets resized or rehashed. - It interferes with externally locking the dict because the inner critical sections can suspend the outer ones. In other words, if the caller use a critical section to lock the dict for multiple iterations, this will break that.
Lines 2883 to 2890 in 8f17d69
PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue) | |
{ | |
int res; | |
Py_BEGIN_CRITICAL_SECTION(op); | |
res = _PyDict_Next(op, ppos, pkey, pvalue, NULL); | |
Py_END_CRITICAL_SECTION(); | |
return res; | |
} |
cc @DinoV
Linked PRs
Metadata
Metadata
Assignees
Labels
3.13bugs and security fixesbugs and security fixes3.14bugs and security fixesbugs and security fixestopic-free-threadingtype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error