mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
gh-120858: PyDict_Next should not lock the dict (#120859)
PyDict_Next no longer locks the dictionary in the free-threaded build. Locking around individual PyDict_Next calls is not sufficient because the function returns borrowed references and because it allows concurrent modifications during the iteraiton loop. The internal locking also interferes with correct external synchronization because it may suspend outer critical sections created by the caller.
This commit is contained in:
parent
dee63cb359
commit
375b723d58
4 changed files with 34 additions and 8 deletions
|
@ -2808,8 +2808,6 @@ _PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey,
|
|||
if (!PyDict_Check(op))
|
||||
return 0;
|
||||
|
||||
ASSERT_DICT_LOCKED(op);
|
||||
|
||||
mp = (PyDictObject *)op;
|
||||
i = *ppos;
|
||||
if (_PyDict_HasSplitTable(mp)) {
|
||||
|
@ -2882,11 +2880,7 @@ _PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey,
|
|||
int
|
||||
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;
|
||||
return _PyDict_Next(op, ppos, pkey, pvalue, NULL);
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue