Commit 7173801a authored by Pavel Vainerman's avatar Pavel Vainerman

ModbusTCPSession <--> ModbusTCPServer перевёл на std:shared_ptr.

parent 12bc66ae
...@@ -118,7 +118,7 @@ class ModbusTCPServer: ...@@ -118,7 +118,7 @@ class ModbusTCPServer:
virtual void ioAccept(ev::io& watcher, int revents); virtual void ioAccept(ev::io& watcher, int revents);
void onTimer( ev::timer& t, int revents ); void onTimer( ev::timer& t, int revents );
void sessionFinished( ModbusTCPSession* s ); void sessionFinished( const ModbusTCPSession* s );
virtual size_t getNextData( unsigned char* buf, int len ) override virtual size_t getNextData( unsigned char* buf, int len ) override
{ {
...@@ -140,7 +140,7 @@ class ModbusTCPServer: ...@@ -140,7 +140,7 @@ class ModbusTCPServer:
ModbusTCP::MBAPHeader curQueryHeader; ModbusTCP::MBAPHeader curQueryHeader;
std::mutex sMutex; std::mutex sMutex;
typedef std::list<ModbusTCPSession*> SessionList; typedef std::list<std::shared_ptr<ModbusTCPSession>> SessionList;
SessionList slist; SessionList slist;
bool ignoreAddr = { false }; bool ignoreAddr = { false };
......
...@@ -41,7 +41,7 @@ class ModbusTCPSession: ...@@ -41,7 +41,7 @@ class ModbusTCPSession:
virtual void cleanupChannel() override; virtual void cleanupChannel() override;
virtual void terminate() override; virtual void terminate() override;
typedef sigc::slot<void, ModbusTCPSession*> FinalSlot; typedef sigc::slot<void, const ModbusTCPSession*> FinalSlot;
void connectFinalSession( FinalSlot sl ); void connectFinalSession( FinalSlot sl );
......
...@@ -59,7 +59,7 @@ void ModbusTCPServer::setMaxSessions( size_t num ) ...@@ -59,7 +59,7 @@ void ModbusTCPServer::setMaxSessions( size_t num )
int d = 0; int d = 0;
for( SessionList::reverse_iterator i = slist.rbegin(); d < k && i != slist.rend(); ++i, d++ ) for( SessionList::reverse_iterator i = slist.rbegin(); d < k && i != slist.rend(); ++i, d++ )
delete *i; (*i).reset();
sessCount = num; sessCount = num;
} }
...@@ -145,13 +145,13 @@ void ModbusTCPServer::evfinish() ...@@ -145,13 +145,13 @@ void ModbusTCPServer::evfinish()
} }
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
void ModbusTCPServer::sessionFinished( ModbusTCPSession* s ) void ModbusTCPServer::sessionFinished( const ModbusTCPSession* s )
{ {
std::lock_guard<std::mutex> l(sMutex); std::lock_guard<std::mutex> l(sMutex);
for( auto i = slist.begin(); i != slist.end(); ++i ) for( auto i = slist.begin(); i != slist.end(); ++i )
{ {
if( (*i) == s ) if( (*i).get() == s )
{ {
slist.erase(i); slist.erase(i);
sessCount--; sessCount--;
...@@ -237,7 +237,7 @@ void ModbusTCPServer::ioAccept(ev::io& watcher, int revents) ...@@ -237,7 +237,7 @@ void ModbusTCPServer::ioAccept(ev::io& watcher, int revents)
try try
{ {
ModbusTCPSession* s = new ModbusTCPSession(watcher.fd, *vmbaddr, sessTimeout); auto s = make_shared<ModbusTCPSession>(watcher.fd, *vmbaddr, sessTimeout);
s->connectReadCoil( sigc::mem_fun(this, &ModbusTCPServer::readCoilStatus) ); s->connectReadCoil( sigc::mem_fun(this, &ModbusTCPServer::readCoilStatus) );
s->connectReadInputStatus( sigc::mem_fun(this, &ModbusTCPServer::readInputStatus) ); s->connectReadInputStatus( sigc::mem_fun(this, &ModbusTCPServer::readInputStatus) );
s->connectReadOutput( sigc::mem_fun(this, &ModbusTCPServer::readOutputRegisters) ); s->connectReadOutput( sigc::mem_fun(this, &ModbusTCPServer::readOutputRegisters) );
......
...@@ -140,10 +140,7 @@ void ModbusTCPSession::callback( ev::io& watcher, int revents ) ...@@ -140,10 +140,7 @@ void ModbusTCPSession::callback( ev::io& watcher, int revents )
if( dlog->is_info() ) if( dlog->is_info() )
dlog->info() << peername << ": stop session... disconnect.." << endl; dlog->info() << peername << ": stop session... disconnect.." << endl;
io.stop(); terminate();
ioTimeout.stop();
final();
delete this;
} }
else else
ioTimeout.start(sessTimeout); // restart timer.. ioTimeout.start(sessTimeout); // restart timer..
...@@ -408,7 +405,7 @@ void ModbusTCPSession::terminate() ...@@ -408,7 +405,7 @@ void ModbusTCPSession::terminate()
ModbusServer::terminate(); ModbusServer::terminate();
sock.reset(); // close.. sock.reset(); // close..
final(); final(); // после этого вызова возможно данный объект будет разрушен!
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
mbErrCode ModbusTCPSession::readCoilStatus( ReadCoilMessage& query, mbErrCode ModbusTCPSession::readCoilStatus( ReadCoilMessage& query,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment