From fc3f14861d3f78994813a6dd83a0497e73203445 Mon Sep 17 00:00:00 2001 From: Gordon Sim Date: Tue, 30 Sep 2014 14:01:41 +0000 Subject: QPID-6127: avoid using negative durations with sys::BlockingQueue.pop() as it will not throw when expected git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1628444 13f79535-47bb-0310-9956-ffa450edef68 --- .../src/qpid/client/amqp0_10/IncomingMessages.cpp | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) (limited to 'qpid/cpp/src') diff --git a/qpid/cpp/src/qpid/client/amqp0_10/IncomingMessages.cpp b/qpid/cpp/src/qpid/client/amqp0_10/IncomingMessages.cpp index 6d62c44be8..e8f36ae8ea 100644 --- a/qpid/cpp/src/qpid/client/amqp0_10/IncomingMessages.cpp +++ b/qpid/cpp/src/qpid/client/amqp0_10/IncomingMessages.cpp @@ -126,6 +126,24 @@ void IncomingMessages::setSession(qpid::client::AsyncSession s) acceptTracker.reset(); } +namespace { +qpid::sys::Duration get_duration(qpid::sys::Duration timeout, qpid::sys::AbsTime deadline) +{ + if (timeout == qpid::sys::TIME_INFINITE) { + return qpid::sys::TIME_INFINITE; + } else if (timeout == 0) { + return 0; + } else { + qpid::sys::AbsTime n = AbsTime::now(); + if (n < deadline) { + return qpid::sys::Duration(n, deadline); + } else { + return 0; + } + } +} +} + bool IncomingMessages::get(Handler& handler, qpid::sys::Duration timeout) { sys::Mutex::ScopedLock l(lock); @@ -152,7 +170,7 @@ bool IncomingMessages::get(Handler& handler, qpid::sys::Duration timeout) ScopedRelease release(inUse, lock); sys::Mutex::ScopedUnlock l(lock); //wait for suitable new message to arrive - if (process(&handler, timeout == qpid::sys::TIME_INFINITE ? qpid::sys::TIME_INFINITE : qpid::sys::Duration(AbsTime::now(), deadline))) { + if (process(&handler, get_duration(timeout, deadline))) { return true; } } @@ -184,7 +202,7 @@ bool IncomingMessages::getNextDestination(std::string& destination, qpid::sys::D ScopedRelease release(inUse, lock); sys::Mutex::ScopedUnlock l(lock); //wait for an incoming message - wait(timeout == qpid::sys::TIME_INFINITE ? qpid::sys::TIME_INFINITE : qpid::sys::Duration(AbsTime::now(), deadline)); + wait(get_duration(timeout, deadline)); } if (!(AbsTime::now() < deadline)) break; } -- cgit v1.2.1