From a18e518ac8a6a7b98d62b66e10e4b8714b2a55d8 Mon Sep 17 00:00:00 2001 From: thijs-blom <45999325+thijs-blom@users.noreply.github.com> Date: Thu, 17 Jan 2019 16:16:38 +0100 Subject: [PATCH] when heartbeats were disabled, the event loop refcount would not be restored correctly after the timer expired. This has been fixed (#281) --- include/amqpcpp/libev.h | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/include/amqpcpp/libev.h b/include/amqpcpp/libev.h index c9aa529..b3ce7b8 100644 --- a/include/amqpcpp/libev.h +++ b/include/amqpcpp/libev.h @@ -221,14 +221,23 @@ private: { // get the current time ev_tstamp now = ev_now(_loop); - + // if the onNegotiate method was not yet called, and no heartbeat timeout was negotiated if (_timeout == 0) { // there is a theoretical scenario in which the onNegotiate() method // was overridden, so that the connection-timeout-timer expires, but - // the connection is ready anyway -- in that case we should ignore the timeout - if (_connection->ready()) return; + // the connection is ready anyway -- in that case we should ignore the timeout. + // this also occurs when heartbeats are disabled. + if (_connection->ready()) + { + // we send no heartbeats, so the timer will be stopped. + // restore the loop refcount + ev_ref(_loop); + + // done + return; + } // the timer expired because the connection could not be set up in time, // close the connection with immediate effect @@ -314,6 +323,9 @@ private: */ virtual ~Wrapper() { + // the timer was already stopped + if (_timeout == 0) return; + // restore loop refcount ev_ref(_loop); @@ -444,15 +456,15 @@ private: protected: /** - * Method that is called when the heartbeat frequency is negotiated between the server and the client. - * @param connection The connection that suggested a heartbeat interval - * @param interval The suggested interval from the server - * @return uint16_t The interval to use + * Method that is called when the heartbeat timeout is negotiated between the server and the client. + * @param connection The connection that suggested a heartbeat timeout + * @param timeout The suggested timeout from the server + * @return uint16_t The timeout to use */ - virtual uint16_t onNegotiate(TcpConnection *connection, uint16_t interval) override + virtual uint16_t onNegotiate(TcpConnection *connection, uint16_t timeout) override { // lookup the wrapper, and start the timer to check for activity and send heartbeats - return lookup(connection).start(interval); + return lookup(connection).start(timeout); } /**