Issue #13502: threading: Fix a race condition in Event.wait() that made it

return False when the event was set and cleared right after.
This commit is contained in:
Charles-François Natali 2012-01-07 18:24:56 +01:00
parent b52e7a9a36
commit ded0348c08
4 changed files with 27 additions and 5 deletions

View File

@ -782,8 +782,10 @@ An event object manages an internal flag that can be set to true with the
floating point number specifying a timeout for the operation in seconds
(or fractions thereof).
This method returns the internal flag on exit, so it will always return
``True`` except if a timeout is given and the operation times out.
This method returns true if and only if the internal flag has been set to
true, either before the wait call or after the wait starts, so it will
always return ``True`` except if a timeout is given and the operation
times out.
.. versionchanged:: 3.1
Previously, the method always returned ``None``.

View File

@ -351,6 +351,22 @@ class EventTests(BaseTestCase):
for r, dt in results2:
self.assertTrue(r)
def test_set_and_clear(self):
# Issue #13502: check that wait() returns true even when the event is
# cleared before the waiting thread is woken up.
evt = self.eventtype()
results = []
N = 5
def f():
results.append(evt.wait(1))
b = Bunch(f, N)
b.wait_for_started()
time.sleep(0.5)
evt.set()
evt.clear()
b.wait_for_finished()
self.assertEqual(results, [True] * N)
class ConditionTests(BaseTestCase):
"""

View File

@ -418,9 +418,10 @@ class _Event(_Verbose):
def wait(self, timeout=None):
self._cond.acquire()
try:
if not self._flag:
self._cond.wait(timeout)
return self._flag
signaled = self._flag
if not signaled:
signaled = self._cond.wait(timeout)
return signaled
finally:
self._cond.release()

View File

@ -97,6 +97,9 @@ Core and Builtins
Library
-------
- Issue #13502: threading: Fix a race condition in Event.wait() that made it
return False when the event was set and cleared right after.
- Issue #12926: Fix a bug in tarfile's link extraction.
- Issue #13696: Fix the 302 Relative URL Redirection problem.