Skip to content

Commit c8af8c9

Browse files
committed
gh-120496: Use CAS approach for rangeiter_next
1 parent 42351c3 commit c8af8c9

File tree

1 file changed

+15
-7
lines changed

1 file changed

+15
-7
lines changed

Objects/rangeobject.c

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -813,16 +813,24 @@ PyTypeObject PyRange_Type = {
813813
in the normal case, but possible for any numeric value.
814814
*/
815815

816+
817+
#include "pycore_pyatomic_ft_wrappers.h"
818+
816819
static PyObject *
817820
rangeiter_next(_PyRangeIterObject *r)
818821
{
819-
if (r->len > 0) {
820-
long result = r->start;
821-
r->start = result + r->step;
822-
r->len--;
823-
return PyLong_FromLong(result);
824-
}
825-
return NULL;
822+
do {
823+
long len = _Py_atomic_load_int64_relaxed(&r->len);
824+
if (len <= 0) {
825+
return NULL;
826+
}
827+
long result = _Py_atomic_load_int64_relaxed(&r->start);
828+
long step = _Py_atomic_load_int64_relaxed(&r->step);
829+
if (_Py_atomic_compare_exchange_int64(&r->start, &result, result + step)) {
830+
_Py_atomic_add_int64(&r->len, -1);
831+
return PyLong_FromLong(result);
832+
}
833+
} while (1);
826834
}
827835

828836
static PyObject *

0 commit comments

Comments
 (0)