diff --git a/eventlet/queue.py b/eventlet/queue.py index 3963381..1bf3aef 100644 --- a/eventlet/queue.py +++ b/eventlet/queue.py @@ -181,6 +181,15 @@ class LightQueue(object): def qsize(self): """Return the size of the queue.""" return len(self.queue) + + def resize(self, size): + """Resizes the queue's maximum size. + + If the size is increased, and there are putters waiting, they may be woken up.""" + if size > self.maxsize: + # Maybe wake some stuff up + self._schedule_unlock() + self.maxsize = size def putting(self): """Returns the number of greenthreads that are blocked waiting to put diff --git a/tests/queue_test.py b/tests/queue_test.py index 99a713b..496a8cc 100644 --- a/tests/queue_test.py +++ b/tests/queue_test.py @@ -68,6 +68,33 @@ class TestQueue(LimitedTestCase): self.assertEquals(evt.wait(),'done') gt.wait() + def test_resize_up(self): + q = eventlet.Queue(0) + def sender(evt, q): + q.put('hi') + evt.send('done') + + evt = event.Event() + gt = eventlet.spawn(sender, evt, q) + eventlet.sleep(0) + self.assert_(not evt.ready()) + q.resize(1) + eventlet.sleep(0) + self.assert_(evt.ready()) + gt.wait() + + def test_resize_down(self): + size = 5 + q = eventlet.Queue(5) + + for i in range(5): + q.put(i) + + self.assertEquals(list(q.queue), range(5)) + q.resize(1) + eventlet.sleep(0) + self.assertEquals(list(q.queue), range(5)) + def test_multiple_waiters(self): # tests that multiple waiters get their results back q = eventlet.Queue()