diff --git a/Destination.cpp b/Destination.cpp index 566f4228..2a60f673 100644 --- a/Destination.cpp +++ b/Destination.cpp @@ -85,34 +85,40 @@ namespace client void ClientDestination::Start () { - m_Pool->SetLocalDestination (this); - m_Pool->SetActive (true); - m_IsRunning = true; - m_Thread = new std::thread (std::bind (&ClientDestination::Run, this)); - m_StreamingDestination->Start (); + if (!m_IsRunning) + { + m_IsRunning = true; + m_Pool->SetLocalDestination (this); + m_Pool->SetActive (true); + m_Thread = new std::thread (std::bind (&ClientDestination::Run, this)); + m_StreamingDestination->Start (); + } } void ClientDestination::Stop () { - m_StreamingDestination->Stop (); - if (m_DatagramDestination) - { - auto d = m_DatagramDestination; - m_DatagramDestination = nullptr; - delete d; - } - if (m_Pool) - { - m_Pool->SetLocalDestination (nullptr); - i2p::tunnel::tunnels.StopTunnelPool (m_Pool); - } - m_IsRunning = false; - m_Service.stop (); - if (m_Thread) + if (m_IsRunning) { - m_Thread->join (); - delete m_Thread; - m_Thread = 0; + m_IsRunning = false; + m_StreamingDestination->Stop (); + if (m_DatagramDestination) + { + auto d = m_DatagramDestination; + m_DatagramDestination = nullptr; + delete d; + } + if (m_Pool) + { + m_Pool->SetLocalDestination (nullptr); + i2p::tunnel::tunnels.StopTunnelPool (m_Pool); + } + m_Service.stop (); + if (m_Thread) + { + m_Thread->join (); + delete m_Thread; + m_Thread = 0; + } } } diff --git a/Destination.h b/Destination.h index e10cd41e..b4d910ad 100644 --- a/Destination.h +++ b/Destination.h @@ -112,7 +112,7 @@ namespace client private: - bool m_IsRunning; + volatile bool m_IsRunning; std::thread * m_Thread; boost::asio::io_service m_Service; boost::asio::io_service::work m_Work;