changeset: 92269:78a38f8bd5d9 parent: 92267:ab81b4cdc33c parent: 92268:4cce39cfe46c user: Antoine Pitrou date: Fri Aug 29 23:27:33 2014 +0200 files: Lib/threading.py Misc/ACKS Misc/NEWS description: 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. diff -r ab81b4cdc33c -r 78a38f8bd5d9 Lib/threading.py --- a/Lib/threading.py Fri Aug 29 17:00:17 2014 +0200 +++ b/Lib/threading.py Fri Aug 29 23:27:33 2014 +0200 @@ -290,6 +290,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() @@ -299,14 +300,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 -r ab81b4cdc33c -r 78a38f8bd5d9 Misc/ACKS --- a/Misc/ACKS Fri Aug 29 17:00:17 2014 +0200 +++ b/Misc/ACKS Fri Aug 29 23:27:33 2014 +0200 @@ -1518,4 +1518,5 @@ Kai Zhu Tarek Ziadé Gennadiy Zlobin +Doug Zongker Peter Åstrand diff -r ab81b4cdc33c -r 78a38f8bd5d9 Misc/NEWS --- a/Misc/NEWS Fri Aug 29 17:00:17 2014 +0200 +++ b/Misc/NEWS Fri Aug 29 23:27:33 2014 +0200 @@ -124,6 +124,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 #22287: On UNIX, _PyTime_gettimeofday() now uses clock_gettime(CLOCK_REALTIME) if available. As a side effect, Python now depends on the librt library on Solaris and on Linux (only with glibc older