summaryrefslogtreecommitdiff
path: root/qpid/cpp/src
diff options
context:
space:
mode:
authorGordon Sim <gsim@apache.org>2014-09-30 14:01:41 +0000
committerGordon Sim <gsim@apache.org>2014-09-30 14:01:41 +0000
commitfc3f14861d3f78994813a6dd83a0497e73203445 (patch)
tree16cce8c2ea85ee36ebd8dc15c8c54869d185362b /qpid/cpp/src
parente6068ab807c8887861cfdc786b839500ed058fc7 (diff)
downloadqpid-python-fc3f14861d3f78994813a6dd83a0497e73203445.tar.gz
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
Diffstat (limited to 'qpid/cpp/src')
-rw-r--r--qpid/cpp/src/qpid/client/amqp0_10/IncomingMessages.cpp22
1 files changed, 20 insertions, 2 deletions
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;
}