cpython (3.4): Issue #22185: Fix an occasional RuntimeError in threading.Condition.wait()
http://hg.python.org/cpython/rev/4cce39cfe46c changeset: 92268:4cce39cfe46c branch: 3.4 parent: 92262:a3452677a386 user: Antoine Pitrou <solipsis@pitrou.net> date: Fri Aug 29 23:26:36 2014 +0200 summary: 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. files: Lib/threading.py | 11 ++++++----- Misc/ACKS | 1 + Misc/NEWS | 4 ++++ 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/Lib/threading.py b/Lib/threading.py --- a/Lib/threading.py +++ b/Lib/threading.py @@ -284,6 +284,7 @@ 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() @@ -293,14 +294,14 @@ 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. diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1500,4 +1500,5 @@ Kai Zhu Tarek Ziadé Gennadiy Zlobin +Doug Zongker Peter Åstrand diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -27,6 +27,10 @@ Library ------- +- 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. + - Issue #22182: Use e.args to unpack exceptions correctly in distutils.file_util.move_file. Patch by Claudiu Popa. -- Repository URL: http://hg.python.org/cpython
participants (1)
-
antoine.pitrou