Author: rhs
Date: Thu Oct 25 18:47:04 2012
New Revision: 1402267
URL: http://svn.apache.org/viewvc?rev=1402267&view=rev
Log:
fixed credit overrun
Modified:
qpid/proton/trunk/proton-c/src/messenger.c
Modified: qpid/proton/trunk/proton-c/src/messenger.c
URL:
http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/messenger.c?rev=1402267&r1=1402266&r2=1402267&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/messenger.c (original)
+++ qpid/proton/trunk/proton-c/src/messenger.c Thu Oct 25 18:47:04 2012
@@ -39,6 +39,7 @@ struct pn_messenger_t {
int timeout;
pn_driver_t *driver;
int credit;
+ int distributed;
uint64_t next_tag;
pn_buffer_t *buffer;
pn_error_t *error;
@@ -70,6 +71,7 @@ pn_messenger_t *pn_messenger(const char
m->timeout = -1;
m->driver = pn_driver();
m->credit = 0;
+ m->distributed = 0;
m->next_tag = 0;
m->buffer = pn_buffer(1024);
m->error = pn_error();
@@ -189,6 +191,7 @@ void pn_messenger_flow(pn_messenger_t *m
if (pn_link_is_receiver(link)) {
pn_link_flow(link, 1);
messenger->credit--;
+ messenger->distributed++;
}
link = pn_link_next(link, PN_LOCAL_ACTIVE);
}
@@ -243,7 +246,9 @@ void pn_messenger_reclaim(pn_messenger_t
pn_link_t *link = pn_link_head(conn, 0);
while (link) {
if (pn_link_is_receiver(link) && pn_link_credit(link) > 0) {
- messenger->credit += pn_link_credit(link);
+ int credit = pn_link_credit(link);
+ messenger->credit += credit;
+ messenger->distributed -= credit;
}
link = pn_link_next(link, 0);
}
@@ -654,7 +659,9 @@ int pn_messenger_recv(pn_messenger_t *me
if (!messenger) return PN_ARG_ERR;
if (!pn_listener_head(messenger->driver) &&
!pn_connector_head(messenger->driver))
return pn_error_format(messenger->error, PN_STATE_ERR, "no valid sources");
- messenger->credit += n;
+ int total = messenger->credit + messenger->distributed;
+ if (n > total)
+ messenger->credit += (n - total);
pn_messenger_flow(messenger);
return pn_messenger_sync(messenger, pn_messenger_rcvd);
}
@@ -683,6 +690,7 @@ int pn_messenger_get(pn_messenger_t *mes
n = pn_link_recv(l, encoded + pending, 1);
pn_delivery_update(d, PN_ACCEPTED);
pn_delivery_settle(d);
+ messenger->distributed--;
if (n != PN_EOS) {
return pn_error_format(messenger->error, n, "PN_EOS expected");
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]