diff options
Diffstat (limited to 'qpid/cpp/src/qpid/broker/Queue.cpp')
-rw-r--r-- | qpid/cpp/src/qpid/broker/Queue.cpp | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/qpid/cpp/src/qpid/broker/Queue.cpp b/qpid/cpp/src/qpid/broker/Queue.cpp index 20d9361909..b6b896ce58 100644 --- a/qpid/cpp/src/qpid/broker/Queue.cpp +++ b/qpid/cpp/src/qpid/broker/Queue.cpp @@ -373,11 +373,18 @@ void Queue::removeListener(Consumer::shared_ptr c) bool Queue::dispatch(Consumer::shared_ptr c) { - QueuedMessage msg(this); - if (getNextMessage(msg, c)) { - c->deliver(msg); - return true; - } else { + Stoppable::Scope doDispatch(dispatching); + if (doDispatch) { + QueuedMessage msg(this); + if (getNextMessage(msg, c)) { + c->deliver(msg); + return true; + } else { + return false; + } + } else { // Dispatching is stopped + Mutex::ScopedLock locker(messageLock); + listeners.addListener(c); // FIXME aconway 2011-05-05: return false; } } @@ -1265,3 +1272,13 @@ void Queue::UsageBarrier::destroy() parent.deleted = true; while (count) parent.messageLock.wait(); } + +// FIXME aconway 2011-05-06: naming - only affects consumers. stopDispatch()? +void Queue::stop() { + dispatching.stop(); +} + +void Queue::start() { + dispatching.start(); + notifyListener(); +} |