summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorSam Gross <colesbury@gmail.com>2024-06-24 18:15:15 (GMT)
committerGitHub <noreply@github.com>2024-06-24 18:15:15 (GMT)
commit375b723d5873f948696c7e85a97f4778d9e00ff0 (patch)
tree081f3b0fffac79d58c7b1e3cc81e8a9bdc2e3373 /Objects
parentdee63cb35971b87a09ddda5d6f29cd941f570720 (diff)
downloadcpython-375b723d5873f948696c7e85a97f4778d9e00ff0.zip
cpython-375b723d5873f948696c7e85a97f4778d9e00ff0.tar.gz
cpython-375b723d5873f948696c7e85a97f4778d9e00ff0.tar.bz2
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.
Diffstat (limited to 'Objects')
-rw-r--r--Objects/dictobject.c8
1 files changed, 1 insertions, 7 deletions
diff --git a/Objects/dictobject.c b/Objects/dictobject.c
index 5529e52..5d32546 100644
--- a/Objects/dictobject.c
+++ b/Objects/dictobject.c
@@ -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);
}