summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDino Viehland <dinoviehland@meta.com>2024-03-05 09:08:18 (GMT)
committerGitHub <noreply@github.com>2024-03-05 09:08:18 (GMT)
commitffcc450a9b8b6927549b501eff7ac14abc238448 (patch)
treef0e6c40b726ef51a67bdf1423ccbc493e268a1a8
parent7af063d1d85f965da06a65eca800f4c537d55fa5 (diff)
downloadcpython-ffcc450a9b8b6927549b501eff7ac14abc238448.zip
cpython-ffcc450a9b8b6927549b501eff7ac14abc238448.tar.gz
cpython-ffcc450a9b8b6927549b501eff7ac14abc238448.tar.bz2
gh-112075: Enable freeing with qsbr and fallback to lock on key changed (GH-116336)
-rw-r--r--Objects/dictobject.c9
1 files changed, 3 insertions, 6 deletions
diff --git a/Objects/dictobject.c b/Objects/dictobject.c
index 027cff1..536746c 100644
--- a/Objects/dictobject.c
+++ b/Objects/dictobject.c
@@ -183,9 +183,6 @@ set_values(PyDictObject *mp, PyDictValues *values)
_Py_atomic_store_ptr_release(&mp->ma_values, values);
}
-// Defined until we get QSBR
-#define _PyMem_FreeQsbr PyMem_Free
-
#define LOCK_KEYS(keys) PyMutex_LockFlags(&keys->dk_mutex, _Py_LOCK_DONT_DETACH)
#define UNLOCK_KEYS(keys) PyMutex_Unlock(&keys->dk_mutex)
@@ -806,7 +803,7 @@ free_keys_object(PyDictKeysObject *keys, bool use_qsbr)
{
#ifdef Py_GIL_DISABLED
if (use_qsbr) {
- _PyMem_FreeQsbr(keys);
+ _PyMem_FreeDelayed(keys);
return;
}
#endif
@@ -846,7 +843,7 @@ free_values(PyDictValues *values, bool use_qsbr)
int prefix_size = DICT_VALUES_SIZE(values);
#ifdef Py_GIL_DISABLED
if (use_qsbr) {
- _PyMem_FreeQsbr(((char *)values)-prefix_size);
+ _PyMem_FreeDelayed(((char *)values)-prefix_size);
return;
}
#endif
@@ -6694,7 +6691,7 @@ _PyObject_StoreInstanceAttribute(PyObject *obj, PyDictValues *values,
#ifdef Py_GIL_DISABLED
// Try a thread-safe lookup to see if the index is already allocated
ix = unicodekeys_lookup_unicode_threadsafe(keys, name, hash);
- if (ix == DKIX_EMPTY) {
+ if (ix == DKIX_EMPTY || ix == DKIX_KEY_CHANGED) {
// Lock keys and do insert
LOCK_KEYS(keys);
ix = insert_into_splitdictkeys(keys, name, hash);