fixed crash

This commit is contained in:
orignal 2014-11-22 21:56:59 -05:00
parent 335de27095
commit 4dc33a6f45
2 changed files with 23 additions and 14 deletions

31
SAM.cpp
View File

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

6
SAM.h
View File

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