@@ -4930,7 +4930,7 @@ dictiter_iternext_threadsafe(PyDictObject *d, PyObject *self,
4930
4930
4931
4931
ensure_shared_on_read (d );
4932
4932
4933
- Py_ssize_t start_pos = i = _Py_atomic_load_ssize_relaxed (& di -> di_pos );
4933
+ i = _Py_atomic_load_ssize_relaxed (& di -> di_pos );
4934
4934
k = _Py_atomic_load_ptr_relaxed (& d -> ma_keys );
4935
4935
assert (i >= 0 );
4936
4936
if (_PyDict_HasSplitTable (d )) {
@@ -4990,20 +4990,13 @@ dictiter_iternext_threadsafe(PyDictObject *d, PyObject *self,
4990
4990
}
4991
4991
}
4992
4992
// We found an element (key), but did not expect it
4993
- if (_Py_atomic_load_ssize_relaxed (& di -> len ) == 0 ) {
4993
+ Py_ssize_t len ;
4994
+ if ((len = _Py_atomic_load_ssize_relaxed (& di -> len )) == 0 ) {
4994
4995
goto concurrent_modification ;
4995
4996
}
4996
- if (!_Py_atomic_compare_exchange_ssize (& di -> di_pos , & start_pos , i + 1 )) {
4997
- // We lost a race with someone else iterating...
4998
- if (out_key != NULL ) {
4999
- Py_DECREF (* out_key );
5000
- }
5001
- if (out_value != NULL ) {
5002
- Py_DECREF (* out_value );
5003
- }
5004
- goto try_locked ;
5005
- }
5006
- _Py_atomic_add_ssize (& di -> len , -1 );
4997
+
4998
+ _Py_atomic_store_ssize_relaxed (& di -> di_pos , i + 1 );
4999
+ _Py_atomic_store_ssize_relaxed (& di -> len , len - 1 );
5007
5000
return 1 ;
5008
5001
5009
5002
concurrent_modification :
@@ -5029,22 +5022,16 @@ static bool
5029
5022
acquire_iter_result (PyObject * result )
5030
5023
{
5031
5024
#ifdef Py_GIL_DISABLED
5032
- if (Py_REFCNT (result ) == 1 ) {
5033
- Py_INCREF (result );
5034
- if (Py_REFCNT (result ) == 2 ) {
5035
- return true;
5036
- }
5037
- Py_DECREF (result );
5038
- return false;
5039
- }
5040
- return false;
5025
+ if (_Py_IsOwnedByCurrentThread (result ) &&
5026
+ result -> ob_ref_local == 1 &&
5027
+ _Py_atomic_load_ssize_relaxed (& result -> ob_ref_shared ) == 0 ) {
5041
5028
#else
5042
5029
if (Py_REFCNT (result ) == 1 ) {
5030
+ #endif
5043
5031
Py_INCREF (result );
5044
5032
return true;
5045
5033
}
5046
5034
return false;
5047
- #endif
5048
5035
}
5049
5036
5050
5037
static PyObject *
0 commit comments