Merge pull request #838 from majestrate/sam-crash-fix-2017-03-29

try fixing sam crashyness
This commit is contained in:
orignal 2017-03-29 15:01:22 -04:00 committed by GitHub
commit 3d1b6e29c6
2 changed files with 7 additions and 6 deletions

View File

@ -789,13 +789,14 @@ namespace client
void SAMSession::CloseStreams () void SAMSession::CloseStreams ()
{ {
std::vector<std::shared_ptr<SAMSocket> > socks;
{ {
std::lock_guard<std::mutex> lock(m_SocketsMutex); std::lock_guard<std::mutex> lock(m_SocketsMutex);
for (auto& sock : m_Sockets) { for (const auto& sock : m_Sockets) {
sock->CloseStream(); socks.push_back(sock);
} }
} }
// XXX: should this be done inside locked parts? for (auto & sock : socks ) sock->Terminate();
m_Sockets.clear(); m_Sockets.clear();
} }

6
SAM.h
View File

@ -87,9 +87,9 @@ namespace client
void SetSocketType (SAMSocketType socketType) { m_SocketType = socketType; }; void SetSocketType (SAMSocketType socketType) { m_SocketType = socketType; };
SAMSocketType GetSocketType () const { return m_SocketType; }; SAMSocketType GetSocketType () const { return m_SocketType; };
void Terminate ();
private: private:
void Terminate ();
void HandleHandshakeReceived (const boost::system::error_code& ecode, std::size_t bytes_transferred); void HandleHandshakeReceived (const boost::system::error_code& ecode, std::size_t bytes_transferred);
void HandleHandshakeReplySent (const boost::system::error_code& ecode, std::size_t bytes_transferred); void HandleHandshakeReplySent (const boost::system::error_code& ecode, std::size_t bytes_transferred);
void HandleMessage (const boost::system::error_code& ecode, std::size_t bytes_transferred); void HandleMessage (const boost::system::error_code& ecode, std::size_t bytes_transferred);
@ -143,13 +143,13 @@ namespace client
std::mutex m_SocketsMutex; std::mutex m_SocketsMutex;
/** safely add a socket to this session */ /** safely add a socket to this session */
void AddSocket(std::shared_ptr<SAMSocket> sock) { void AddSocket(const std::shared_ptr<SAMSocket> & sock) {
std::lock_guard<std::mutex> lock(m_SocketsMutex); std::lock_guard<std::mutex> lock(m_SocketsMutex);
m_Sockets.push_back(sock); m_Sockets.push_back(sock);
} }
/** safely remove a socket from this session */ /** safely remove a socket from this session */
void DelSocket(std::shared_ptr<SAMSocket> sock) { void DelSocket(const std::shared_ptr<SAMSocket> & sock) {
std::lock_guard<std::mutex> lock(m_SocketsMutex); std::lock_guard<std::mutex> lock(m_SocketsMutex);
m_Sockets.remove(sock); m_Sockets.remove(sock);
} }