diff options
author | Raymond Hettinger <python@rcn.com> | 2006-03-25 12:15:04 (GMT) |
---|---|---|
committer | Raymond Hettinger <python@rcn.com> | 2006-03-25 12:15:04 (GMT) |
commit | c4e94b90a84a1127078bdb9f63707eb71fedece3 (patch) | |
tree | 51d3913a6268f8f074a5492dd8aecc12f3033500 | |
parent | ccc7bb4ef296fecb01c4cc7266dd0ca95151e893 (diff) | |
download | cpython-c4e94b90a84a1127078bdb9f63707eb71fedece3.zip cpython-c4e94b90a84a1127078bdb9f63707eb71fedece3.tar.gz cpython-c4e94b90a84a1127078bdb9f63707eb71fedece3.tar.bz2 |
Don't decrement below zero. And add more tests.
-rw-r--r-- | Lib/Queue.py | 3 | ||||
-rw-r--r-- | Lib/test/test_queue.py | 20 |
2 files changed, 19 insertions, 4 deletions
diff --git a/Lib/Queue.py b/Lib/Queue.py index ad65cf0..51ad354 100644 --- a/Lib/Queue.py +++ b/Lib/Queue.py @@ -56,11 +56,12 @@ class Queue: """ self.all_tasks_done.acquire() try: - self.unfinished_tasks = unfinished = self.unfinished_tasks - 1 + unfinished = self.unfinished_tasks - 1 if unfinished <= 0: if unfinished < 0: raise ValueError('task_done() called too many times') self.all_tasks_done.notifyAll() + self.unfinished_tasks = unfinished finally: self.all_tasks_done.release() diff --git a/Lib/test/test_queue.py b/Lib/test/test_queue.py index 77a1c9d..b3f24df 100644 --- a/Lib/test/test_queue.py +++ b/Lib/test/test_queue.py @@ -228,6 +228,9 @@ def worker(q): global cum while True: x = q.get() + if x is None: + q.task_done() + return cumlock.acquire() try: cum += x @@ -239,18 +242,29 @@ def QueueJoinTest(q): global cum cum = 0 for i in (0,1): - t = threading.Thread(target=worker, args=(q,)) - t.setDaemon(True) - t.start() + threading.Thread(target=worker, args=(q,)).start() for i in xrange(100): q.put(i) q.join() verify(cum==sum(range(100)), "q.join() did not block until all tasks were done") + for i in (0,1): + q.put(None) # instruct the threads to close + q.join() # verify that you can join twice + +def QueueTaskDoneTest(q) + try: + q.task_done() + except ValueError: + pass + else: + raise TestFailed("Did not detect task count going negative") def test(): q = Queue.Queue() + QueueTaskDoneTest(q) QueueJoinTest(q) QueueJoinTest(q) + QueueTaskDoneTest(q) q = Queue.Queue(QUEUE_SIZE) # Do it a couple of times on the same queue |