when heartbeats were disabled, the event loop refcount would not be restored correctly after the timer expired. This has been fixed (#281)
This commit is contained in:
parent
532cc731fb
commit
a18e518ac8
|
|
@ -221,14 +221,23 @@ private:
|
||||||
{
|
{
|
||||||
// get the current time
|
// get the current time
|
||||||
ev_tstamp now = ev_now(_loop);
|
ev_tstamp now = ev_now(_loop);
|
||||||
|
|
||||||
// if the onNegotiate method was not yet called, and no heartbeat timeout was negotiated
|
// if the onNegotiate method was not yet called, and no heartbeat timeout was negotiated
|
||||||
if (_timeout == 0)
|
if (_timeout == 0)
|
||||||
{
|
{
|
||||||
// there is a theoretical scenario in which the onNegotiate() method
|
// there is a theoretical scenario in which the onNegotiate() method
|
||||||
// was overridden, so that the connection-timeout-timer expires, but
|
// was overridden, so that the connection-timeout-timer expires, but
|
||||||
// the connection is ready anyway -- in that case we should ignore the timeout
|
// the connection is ready anyway -- in that case we should ignore the timeout.
|
||||||
if (_connection->ready()) return;
|
// 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,
|
// the timer expired because the connection could not be set up in time,
|
||||||
// close the connection with immediate effect
|
// close the connection with immediate effect
|
||||||
|
|
@ -314,6 +323,9 @@ private:
|
||||||
*/
|
*/
|
||||||
virtual ~Wrapper()
|
virtual ~Wrapper()
|
||||||
{
|
{
|
||||||
|
// the timer was already stopped
|
||||||
|
if (_timeout == 0) return;
|
||||||
|
|
||||||
// restore loop refcount
|
// restore loop refcount
|
||||||
ev_ref(_loop);
|
ev_ref(_loop);
|
||||||
|
|
||||||
|
|
@ -444,15 +456,15 @@ private:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/**
|
/**
|
||||||
* Method that is called when the heartbeat frequency is negotiated between the server and the client.
|
* Method that is called when the heartbeat timeout is negotiated between the server and the client.
|
||||||
* @param connection The connection that suggested a heartbeat interval
|
* @param connection The connection that suggested a heartbeat timeout
|
||||||
* @param interval The suggested interval from the server
|
* @param timeout The suggested timeout from the server
|
||||||
* @return uint16_t The interval to use
|
* @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
|
// lookup the wrapper, and start the timer to check for activity and send heartbeats
|
||||||
return lookup(connection).start(interval);
|
return lookup(connection).start(timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue