diff options
Diffstat (limited to 'qpid/cpp/src')
| -rw-r--r-- | qpid/cpp/src/qpid/messaging/amqp/ConnectionContext.cpp | 6 | ||||
| -rw-r--r-- | qpid/cpp/src/qpid/messaging/amqp/ReceiverContext.cpp | 12 | ||||
| -rw-r--r-- | qpid/cpp/src/qpid/messaging/amqp/ReceiverContext.h | 2 |
3 files changed, 18 insertions, 2 deletions
diff --git a/qpid/cpp/src/qpid/messaging/amqp/ConnectionContext.cpp b/qpid/cpp/src/qpid/messaging/amqp/ConnectionContext.cpp index 5aba00fc50..e08b387e85 100644 --- a/qpid/cpp/src/qpid/messaging/amqp/ConnectionContext.cpp +++ b/qpid/cpp/src/qpid/messaging/amqp/ConnectionContext.cpp @@ -272,7 +272,11 @@ bool ConnectionContext::get(boost::shared_ptr<SessionContext> ssn, boost::shared pn_link_advance(lnk->receiver); if (lnk->capacity) { pn_link_flow(lnk->receiver, 1); - wakeupDriver();//TODO: wakeup less frequently + if (lnk->wakeupToIssueCredit()) { + wakeupDriver(); + } else { + haveOutput = true; + } } return true; } else if (until > qpid::sys::now()) { diff --git a/qpid/cpp/src/qpid/messaging/amqp/ReceiverContext.cpp b/qpid/cpp/src/qpid/messaging/amqp/ReceiverContext.cpp index 7eaa1c068b..08cc130a9e 100644 --- a/qpid/cpp/src/qpid/messaging/amqp/ReceiverContext.cpp +++ b/qpid/cpp/src/qpid/messaging/amqp/ReceiverContext.cpp @@ -36,7 +36,7 @@ ReceiverContext::ReceiverContext(pn_session_t* session, const std::string& n, co address(a), helper(address), receiver(pn_receiver(session, name.c_str())), - capacity(0) {} + capacity(0), used(0) {} ReceiverContext::~ReceiverContext() { //pn_link_free(receiver); @@ -125,4 +125,14 @@ bool ReceiverContext::hasCurrent() return pn_link_current(receiver); } +bool ReceiverContext::wakeupToIssueCredit() +{ + if (++used >= (capacity/2)) { + used = 0; + return true; + } else { + return false; + } +} + }}} // namespace qpid::messaging::amqp diff --git a/qpid/cpp/src/qpid/messaging/amqp/ReceiverContext.h b/qpid/cpp/src/qpid/messaging/amqp/ReceiverContext.h index d185ae3146..2b4e8e1986 100644 --- a/qpid/cpp/src/qpid/messaging/amqp/ReceiverContext.h +++ b/qpid/cpp/src/qpid/messaging/amqp/ReceiverContext.h @@ -67,8 +67,10 @@ class ReceiverContext AddressHelper helper; pn_link_t* receiver; uint32_t capacity; + uint32_t used; qpid::sys::AtomicCount fetching; void configure(pn_terminus_t*); + bool wakeupToIssueCredit(); }; }}} // namespace qpid::messaging::amqp |
