gh-124642: Dictionaries aren't marking objects as weakref'd (#124643)

Dictionaries aren't marking objects as weakref'd
This commit is contained in:
Dino Viehland 2024-09-30 10:04:32 -07:00 committed by GitHub
parent cce1125574
commit 077e7ef6a0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 4 additions and 3 deletions

View File

@ -0,0 +1 @@
Fixed scalability issue in free-threaded builds for lock-free reads from dictionaries in multi-threaded scenarios

View File

@ -1488,7 +1488,7 @@ read_failed:
*value_addr = value; *value_addr = value;
if (value != NULL) { if (value != NULL) {
assert(ix >= 0); assert(ix >= 0);
Py_INCREF(value); _Py_NewRefWithLock(value);
} }
Py_END_CRITICAL_SECTION(); Py_END_CRITICAL_SECTION();
return ix; return ix;
@ -7015,7 +7015,7 @@ _PyObject_TryGetInstanceAttribute(PyObject *obj, PyObject *name, PyObject **attr
// Still no dict, we can read from the values // Still no dict, we can read from the values
assert(values->valid); assert(values->valid);
value = values->values[ix]; value = values->values[ix];
*attr = Py_XNewRef(value); *attr = _Py_XNewRefWithLock(value);
success = true; success = true;
} }
@ -7035,7 +7035,7 @@ _PyObject_TryGetInstanceAttribute(PyObject *obj, PyObject *name, PyObject **attr
if (dict->ma_values == values && FT_ATOMIC_LOAD_UINT8(values->valid)) { if (dict->ma_values == values && FT_ATOMIC_LOAD_UINT8(values->valid)) {
value = _Py_atomic_load_ptr_relaxed(&values->values[ix]); value = _Py_atomic_load_ptr_relaxed(&values->values[ix]);
*attr = Py_XNewRef(value); *attr = _Py_XNewRefWithLock(value);
success = true; success = true;
} else { } else {
// Caller needs to lookup from the dictionary // Caller needs to lookup from the dictionary