diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2014-08-29 21:27:33 (GMT) |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2014-08-29 21:27:33 (GMT) |
commit | fa9211b11dd9b78afbb3dda617267c150ba04cf0 (patch) | |
tree | e2ae8c9370e7957ea41f72ce18a9a2a552a7a610 /Lib/threading.py | |
parent | 67ca33dbf44524516991d9152c4d8a7ff57f0335 (diff) | |
parent | a64b92edd3b7c9145e014aac9a15821d7b05b71a (diff) | |
download | cpython-fa9211b11dd9b78afbb3dda617267c150ba04cf0.zip cpython-fa9211b11dd9b78afbb3dda617267c150ba04cf0.tar.gz cpython-fa9211b11dd9b78afbb3dda617267c150ba04cf0.tar.bz2 |
Issue #22185: Fix an occasional RuntimeError in threading.Condition.wait() caused by mutation of the waiters queue without holding the lock.
Patch by Doug Zongker.
Diffstat (limited to 'Lib/threading.py')
-rw-r--r-- | Lib/threading.py | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/Lib/threading.py b/Lib/threading.py index c7c4478..66620a9 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -290,6 +290,7 @@ class Condition: waiter.acquire() self._waiters.append(waiter) saved_state = self._release_save() + gotit = False try: # restore state no matter what (e.g., KeyboardInterrupt) if timeout is None: waiter.acquire() @@ -299,14 +300,14 @@ class Condition: gotit = waiter.acquire(True, timeout) else: gotit = waiter.acquire(False) - if not gotit: - try: - self._waiters.remove(waiter) - except ValueError: - pass return gotit finally: self._acquire_restore(saved_state) + if not gotit: + try: + self._waiters.remove(waiter) + except ValueError: + pass def wait_for(self, predicate, timeout=None): """Wait until a condition evaluates to True. |