the TcpConnection class no longer calls back to userspace / to the user-supplied handler if user-space explicitly destructs the object
This commit is contained in:
parent
a75b3d5d18
commit
e7f76bc75d
|
|
@ -91,7 +91,7 @@ private:
|
||||||
virtual void onHeartbeat(Connection *connection) override
|
virtual void onHeartbeat(Connection *connection) override
|
||||||
{
|
{
|
||||||
// pass on to tcp handler
|
// pass on to tcp handler
|
||||||
_handler->onHeartbeat(this);
|
if (_handler) _handler->onHeartbeat(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -108,7 +108,7 @@ private:
|
||||||
virtual void onReady(Connection *connection) override
|
virtual void onReady(Connection *connection) override
|
||||||
{
|
{
|
||||||
// pass on to the handler
|
// pass on to the handler
|
||||||
_handler->onReady(this);
|
if (_handler) _handler->onReady(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -124,7 +124,7 @@ private:
|
||||||
virtual void onConnected(TcpState *state) override
|
virtual void onConnected(TcpState *state) override
|
||||||
{
|
{
|
||||||
// pass on to the handler
|
// pass on to the handler
|
||||||
_handler->onConnected(this);
|
if (_handler) _handler->onConnected(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -136,7 +136,7 @@ private:
|
||||||
virtual bool onSecured(TcpState *state, const SSL *ssl) override
|
virtual bool onSecured(TcpState *state, const SSL *ssl) override
|
||||||
{
|
{
|
||||||
// pass on to user-space
|
// pass on to user-space
|
||||||
return _handler->onSecured(this, ssl);
|
return _handler && _handler->onSecured(this, ssl);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -160,7 +160,7 @@ private:
|
||||||
virtual void onIdle(TcpState *state, int socket, int events) override
|
virtual void onIdle(TcpState *state, int socket, int events) override
|
||||||
{
|
{
|
||||||
// pass on to user-space
|
// pass on to user-space
|
||||||
return _handler->monitor(this, socket, events);
|
if (_handler) _handler->monitor(this, socket, events);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
* Implementation file for the TCP connection
|
* Implementation file for the TCP connection
|
||||||
*
|
*
|
||||||
* @author Emiel Bruijntjes <emiel.bruijntjes@copernica.com>
|
* @author Emiel Bruijntjes <emiel.bruijntjes@copernica.com>
|
||||||
* @copyright 2015 - 2018 Copernica BV
|
* @copyright 2015 - 2020 Copernica BV
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -36,7 +36,16 @@ TcpConnection::TcpConnection(TcpHandler *handler, const Address &address) :
|
||||||
/**
|
/**
|
||||||
* Destructor
|
* Destructor
|
||||||
*/
|
*/
|
||||||
TcpConnection::~TcpConnection() noexcept = default;
|
TcpConnection::~TcpConnection() noexcept
|
||||||
|
{
|
||||||
|
// When the object is destructed, the _state-pointer will also destruct, resulting
|
||||||
|
// in some final calls back to us to inform that the connection has indeed been closed.
|
||||||
|
// This normally results in calls back to user-space (via the _handler pointer) but
|
||||||
|
// since user-space is apparently no longer interested in the TcpConnection (why would
|
||||||
|
// it otherwise prematurely destruct the object?) we reset the handler-pointer to
|
||||||
|
// prevent that such calls back to userspace take place
|
||||||
|
_handler = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The filedescriptor that is used for this connection
|
* The filedescriptor that is used for this connection
|
||||||
|
|
@ -121,7 +130,7 @@ bool TcpConnection::close(bool immediate)
|
||||||
if (!monitor.valid()) return true;
|
if (!monitor.valid()) return true;
|
||||||
|
|
||||||
// tell the handler that the connection was closed
|
// tell the handler that the connection was closed
|
||||||
if (failed) _handler->onError(this, "connection prematurely closed by client");
|
if (failed && _handler) _handler->onError(this, "connection prematurely closed by client");
|
||||||
|
|
||||||
// stop if object was destructed
|
// stop if object was destructed
|
||||||
if (!monitor.valid()) return true;
|
if (!monitor.valid()) return true;
|
||||||
|
|
@ -143,7 +152,7 @@ bool TcpConnection::close(bool immediate)
|
||||||
void TcpConnection::onProperties(Connection *connection, const Table &server, Table &client)
|
void TcpConnection::onProperties(Connection *connection, const Table &server, Table &client)
|
||||||
{
|
{
|
||||||
// tell the handler
|
// tell the handler
|
||||||
return _handler->onProperties(this, server, client);
|
if (_handler) _handler->onProperties(this, server, client);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -158,7 +167,7 @@ uint16_t TcpConnection::onNegotiate(Connection *connection, uint16_t interval)
|
||||||
_state->maxframe(connection->maxFrame());
|
_state->maxframe(connection->maxFrame());
|
||||||
|
|
||||||
// tell the handler
|
// tell the handler
|
||||||
return _handler->onNegotiate(this, interval);
|
return _handler ? _handler->onNegotiate(this, interval) : interval;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -184,7 +193,7 @@ void TcpConnection::onError(Connection *connection, const char *message)
|
||||||
Monitor monitor(this);
|
Monitor monitor(this);
|
||||||
|
|
||||||
// tell this to the user
|
// tell this to the user
|
||||||
_handler->onError(this, message);
|
if (_handler) _handler->onError(this, message);
|
||||||
|
|
||||||
// object could be destructed by user-space
|
// object could be destructed by user-space
|
||||||
if (!monitor.valid()) return;
|
if (!monitor.valid()) return;
|
||||||
|
|
@ -214,6 +223,9 @@ void TcpConnection::onClosed(Connection *connection)
|
||||||
*/
|
*/
|
||||||
void TcpConnection::onError(TcpState *state, const char *message, bool connected)
|
void TcpConnection::onError(TcpState *state, const char *message, bool connected)
|
||||||
{
|
{
|
||||||
|
// if user-space is no longer interested in this object, the rest of the code is pointless here
|
||||||
|
if (_handler == nullptr) return;
|
||||||
|
|
||||||
// monitor to check if all operations are active
|
// monitor to check if all operations are active
|
||||||
Monitor monitor(this);
|
Monitor monitor(this);
|
||||||
|
|
||||||
|
|
@ -240,6 +252,9 @@ void TcpConnection::onError(TcpState *state, const char *message, bool connected
|
||||||
*/
|
*/
|
||||||
void TcpConnection::onLost(TcpState *state)
|
void TcpConnection::onLost(TcpState *state)
|
||||||
{
|
{
|
||||||
|
// if user-space is no longer interested in this object, the rest of the code is pointless here
|
||||||
|
if (_handler == nullptr) return;
|
||||||
|
|
||||||
// monitor to check if "this" is destructed
|
// monitor to check if "this" is destructed
|
||||||
Monitor monitor(this);
|
Monitor monitor(this);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue