Skip to content

Commit d14856c

Browse files
committed
Address comment
1 parent b32b5ec commit d14856c

File tree

3 files changed

+11
-15
lines changed

3 files changed

+11
-15
lines changed

Lib/test/test_free_threading/test_set.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ def worker():
168168

169169
@threading_helper.reap_threads
170170
def test_length_hint_exhaust_race(self):
171-
NUM_ITERS = 50
171+
NUM_ITERS = 10
172172
NUM_THREADS = 10
173173

174174
for _ in range(NUM_ITERS):
@@ -187,7 +187,7 @@ def worker():
187187

188188
@threading_helper.reap_threads
189189
def test_iternext_concurrent_exhaust_race(self):
190-
NUM_ITERS = 200
190+
NUM_ITERS = 10
191191
NUM_THREADS = 10
192192

193193
for _ in range(NUM_ITERS):
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
Fix potential races in set iterators (``__length_hint__`` and iteration) in free-threaded builds.
1+
Fix potential races in set iterators (``__length_hint__`` and iteration) in free-threaded builds.

Objects/setobject.c

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1059,14 +1059,13 @@ setiter_len(PyObject *op, PyObject *Py_UNUSED(ignored))
10591059

10601060
#ifdef Py_GIL_DISABLED
10611061
PySetObject *so = si->si_set;
1062-
if (so != NULL) {
1063-
Py_BEGIN_CRITICAL_SECTION2(op, so);
1064-
if (si->si_pos >= 0 && si->si_used == so->used)
1065-
{
1066-
len = si->len;
1067-
}
1068-
Py_END_CRITICAL_SECTION2();
1062+
assert(so != NULL);
1063+
1064+
Py_BEGIN_CRITICAL_SECTION2(op, so);
1065+
if (si->si_pos >= 0 && si->si_used == so->used) {
1066+
len = si->len;
10691067
}
1068+
Py_END_CRITICAL_SECTION2();
10701069
#else
10711070
if (si->si_set != NULL && si->si_used == si->si_set->used) {
10721071
len = si->len;
@@ -1112,9 +1111,6 @@ setiter_iternext(PyObject *self)
11121111
Py_ssize_t i, mask;
11131112
setentry *entry;
11141113
PySetObject *so = si->si_set;
1115-
#ifndef Py_GIL_DISABLED
1116-
int decref_so = 0;
1117-
#endif
11181114

11191115
if (so == NULL) {
11201116
return NULL;
@@ -1160,7 +1156,6 @@ setiter_iternext(PyObject *self)
11601156
si->len = 0;
11611157
#ifndef Py_GIL_DISABLED
11621158
si->si_set = NULL;
1163-
decref_so = 1;
11641159
#endif
11651160
}
11661161

@@ -1171,7 +1166,8 @@ setiter_iternext(PyObject *self)
11711166
#else
11721167
Py_END_CRITICAL_SECTION();
11731168

1174-
if (decref_so) {
1169+
if (key == NULL) {
1170+
/* exhausted */
11751171
Py_DECREF(so);
11761172
return NULL;
11771173
}

0 commit comments

Comments
 (0)