From 0c7c464af2a93a13b5cd85e358aa77a55eec9c7d Mon Sep 17 00:00:00 2001 From: "A. Jesse Jiryu Davis" Date: Sat, 28 Feb 2015 13:44:27 -0500 Subject: [PATCH] Fix memory leak in Semaphore. --- tornado/locks.py | 3 ++- tornado/test/locks_test.py | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/tornado/locks.py b/tornado/locks.py index 1367e1de8..684945a8f 100644 --- a/tornado/locks.py +++ b/tornado/locks.py @@ -181,7 +181,8 @@ class Semaphore(object): def release(self): """Increment the counter and wake one waiter.""" self._value += 1 - for waiter in self._waiters: + while self._waiters: + waiter = self._waiters.popleft() if not waiter.done(): self._value -= 1 diff --git a/tornado/test/locks_test.py b/tornado/test/locks_test.py index 29d80b94f..44dbcf736 100644 --- a/tornado/test/locks_test.py +++ b/tornado/test/locks_test.py @@ -248,6 +248,7 @@ class SemaphoreTest(AsyncTestCase): sem.release() # Now acquire() is instant. self.assertTrue(sem.acquire().done()) + self.assertEqual(0, len(sem._waiters)) @gen_test def test_acquire_timeout(self): -- 2.47.2