File tree 1 file changed +15
-7
lines changed
1 file changed +15
-7
lines changed Original file line number Diff line number Diff line change @@ -813,16 +813,24 @@ PyTypeObject PyRange_Type = {
813
813
in the normal case, but possible for any numeric value.
814
814
*/
815
815
816
+
817
+ #include "pycore_pyatomic_ft_wrappers.h"
818
+
816
819
static PyObject *
817
820
rangeiter_next (_PyRangeIterObject * r )
818
821
{
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 );
826
834
}
827
835
828
836
static PyObject *
You can’t perform that action at this time.
0 commit comments