Repository navigation
Commit 9e22078
test_set_and_clear() started N threads calling event.wait() and then slept
50 ms (wait_threads_blocked) before calling event.set() and event.clear().
If a thread only reached wait() after clear(), it saw the flag unset and
blocked for LONG_TIMEOUT, and Bunch.__exit__ gave up after SHORT_TIMEOUT.
This happened on CI in the TSan free-threading job.
Wait until all N threads are in the Condition's waiter list instead.
Condition.wait() appends the waiter while holding the lock, and
notify_all() releases every waiter in the list, so each of those threads
is guaranteed to be woken by set().
On a TSan free-threading debug build, pinned to 2 CPUs shared with 4
busy-looping processes, the test failed in 9 of 40 runs before this
change and 0 of 40 after.
Co-authored-by: Victor Stinner <vstinner@python.org>
1 parent 7b1bc41 commit 9e22078
1 file changed
Lines changed: 7 additions & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
566 | 566 | | |
567 | 567 | | |
568 | 568 | | |
| 569 | + | |
| 570 | + | |
569 | 571 | | |
570 | 572 | | |
571 | 573 | | |
| |||
576 | 578 | | |
577 | 579 | | |
578 | 580 | | |
579 | | - | |
580 | | - | |
| 581 | + | |
| 582 | + | |
| 583 | + | |
| 584 | + | |
| 585 | + | |
581 | 586 | | |
582 | 587 | | |
583 | 588 | | |
| |||
0 commit comments