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

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

parent 12bc66ae
......@@ -118,7 +118,7 @@ class ModbusTCPServer:
virtual void ioAccept(ev::io& watcher, 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
{
......@@ -140,7 +140,7 @@ class ModbusTCPServer:
ModbusTCP::MBAPHeader curQueryHeader;
std::mutex sMutex;
typedef std::list<ModbusTCPSession*> SessionList;
typedef std::list<std::shared_ptr<ModbusTCPSession>> SessionList;
SessionList slist;
bool ignoreAddr = { false };
......
......@@ -41,7 +41,7 @@ class ModbusTCPSession:
virtual void cleanupChannel() override;
virtual void terminate() override;
typedef sigc::slot<void, ModbusTCPSession*> FinalSlot;
typedef sigc::slot<void, const ModbusTCPSession*> FinalSlot;
void connectFinalSession( FinalSlot sl );
......
......@@ -59,7 +59,7 @@ void ModbusTCPServer::setMaxSessions( size_t num )
int d = 0;
for( SessionList::reverse_iterator i = slist.rbegin(); d < k && i != slist.rend(); ++i, d++ )
delete *i;
(*i).reset();
sessCount = num;
}
......@@ -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);
for( auto i = slist.begin(); i != slist.end(); ++i )
{
if( (*i) == s )
if( (*i).get() == s )
{
slist.erase(i);
sessCount--;
......@@ -237,7 +237,7 @@ void ModbusTCPServer::ioAccept(ev::io& watcher, int revents)
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->connectReadInputStatus( sigc::mem_fun(this, &ModbusTCPServer::readInputStatus) );
s->connectReadOutput( sigc::mem_fun(this, &ModbusTCPServer::readOutputRegisters) );
......
......@@ -140,10 +140,7 @@ void ModbusTCPSession::callback( ev::io& watcher, int revents )
if( dlog->is_info() )
dlog->info() << peername << ": stop session... disconnect.." << endl;
io.stop();
ioTimeout.stop();
final();
delete this;
terminate();
}
else
ioTimeout.start(sessTimeout); // restart timer..
......@@ -408,7 +405,7 @@ void ModbusTCPSession::terminate()
ModbusServer::terminate();
sock.reset(); // close..
final();
final(); // после этого вызова возможно данный объект будет разрушен!
}
// -------------------------------------------------------------------------
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