Browse Source

fixed crash

pull/113/head
orignal 10 years ago
parent
commit
4dc33a6f45
  1. 29
      SAM.cpp
  2. 4
      SAM.h

29
SAM.cpp

@ -25,18 +25,22 @@ namespace client
SAMSocket::~SAMSocket () SAMSocket::~SAMSocket ()
{ {
if (m_Stream) Terminate ();
i2p::stream::DeleteStream (m_Stream);
} }
void SAMSocket::Terminate () void SAMSocket::CloseStream ()
{ {
if (m_Stream) if (m_Stream)
{
m_Stream->Close (); m_Stream->Close ();
i2p::stream::DeleteStream (m_Stream);
m_Stream = nullptr;
}
}
// TODO: make this swap atomic void SAMSocket::Terminate ()
auto session = m_Session; {
m_Session = nullptr; CloseStream ();
switch (m_SocketType) switch (m_SocketType)
{ {
@ -45,22 +49,23 @@ namespace client
break; break;
case eSAMSocketTypeStream: case eSAMSocketTypeStream:
{ {
if (session) if (m_Session)
session->sockets.remove (shared_from_this ()); m_Session->sockets.remove (shared_from_this ());
break; break;
} }
case eSAMSocketTypeAcceptor: case eSAMSocketTypeAcceptor:
{ {
if (session) if (m_Session)
{ {
session->sockets.remove (shared_from_this ()); m_Session->sockets.remove (shared_from_this ());
session->localDestination->StopAcceptingStreams (); m_Session->localDestination->StopAcceptingStreams ();
} }
break; break;
} }
default: default:
; ;
} }
m_SocketType = eSAMSocketTypeTerminated;
m_Socket.close (); m_Socket.close ();
} }
@ -670,6 +675,8 @@ namespace client
auto it = m_Sessions.find (id); auto it = m_Sessions.find (id);
if (it != m_Sessions.end ()) if (it != m_Sessions.end ())
{ {
for (auto it1: it->second.sockets)
it1->CloseStream ();
it->second.sockets.clear (); it->second.sockets.clear ();
it->second.localDestination->Stop (); it->second.localDestination->Stop ();
m_Sessions.erase (it); m_Sessions.erase (it);

4
SAM.h

@ -60,7 +60,8 @@ namespace client
eSAMSocketTypeUnknown, eSAMSocketTypeUnknown,
eSAMSocketTypeSession, eSAMSocketTypeSession,
eSAMSocketTypeStream, eSAMSocketTypeStream,
eSAMSocketTypeAcceptor eSAMSocketTypeAcceptor,
eSAMSocketTypeTerminated
}; };
class SAMBridge; class SAMBridge;
@ -71,6 +72,7 @@ namespace client
SAMSocket (SAMBridge& owner); SAMSocket (SAMBridge& owner);
~SAMSocket (); ~SAMSocket ();
void CloseStream (); // TODO: implement it better
boost::asio::ip::tcp::socket& GetSocket () { return m_Socket; }; boost::asio::ip::tcp::socket& GetSocket () { return m_Socket; };
void ReceiveHandshake (); void ReceiveHandshake ();

Loading…
Cancel
Save