summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Misc/NEWS.d/next/Core_and_Builtins/2024-09-27-17-18-53.gh-issue-124642.OCjhBJ.rst1
-rw-r--r--Objects/dictobject.c6
2 files changed, 4 insertions, 3 deletions
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2024-09-27-17-18-53.gh-issue-124642.OCjhBJ.rst b/Misc/NEWS.d/next/Core_and_Builtins/2024-09-27-17-18-53.gh-issue-124642.OCjhBJ.rst
new file mode 100644
index 0000000..2976384
--- /dev/null
+++ b/Misc/NEWS.d/next/Core_and_Builtins/2024-09-27-17-18-53.gh-issue-124642.OCjhBJ.rst
@@ -0,0 +1 @@
+Fixed scalability issue in free-threaded builds for lock-free reads from dictionaries in multi-threaded scenarios
diff --git a/Objects/dictobject.c b/Objects/dictobject.c
index 7f7fd83..a5a5bce 100644
--- a/Objects/dictobject.c
+++ b/Objects/dictobject.c
@@ -1549,7 +1549,7 @@ read_failed:
*value_addr = value;
if (value != NULL) {
assert(ix >= 0);
- Py_INCREF(value);
+ _Py_NewRefWithLock(value);
}
Py_END_CRITICAL_SECTION();
return ix;
@@ -6988,7 +6988,7 @@ _PyObject_TryGetInstanceAttribute(PyObject *obj, PyObject *name, PyObject **attr
// Still no dict, we can read from the values
assert(values->valid);
value = values->values[ix];
- *attr = Py_XNewRef(value);
+ *attr = _Py_XNewRefWithLock(value);
success = true;
}
@@ -7008,7 +7008,7 @@ _PyObject_TryGetInstanceAttribute(PyObject *obj, PyObject *name, PyObject **attr
if (dict->ma_values == values && FT_ATOMIC_LOAD_UINT8(values->valid)) {
value = _Py_atomic_load_ptr_relaxed(&values->values[ix]);
- *attr = Py_XNewRef(value);
+ *attr = _Py_XNewRefWithLock(value);
success = true;
} else {
// Caller needs to lookup from the dictionary