atomics have been used for threads stop

This commit is contained in:
brain5lug 2017-10-01 00:46:49 +03:00
parent 8c09a7429c
commit dfa1482ab2
15 changed files with 259 additions and 212 deletions

View file

@ -8,6 +8,7 @@
#include "Destination.h"
#include "Streaming.h"
#include <functional>
#include <atomic>
#include <websocketpp/config/asio_no_tls.hpp>
#include <websocketpp/server.hpp>
@ -100,35 +101,41 @@ namespace client
void Start()
{
if(m_Run) return; // already started
m_Server.listen(boost::asio::ip::address::from_string(m_Addr), m_Port);
m_Server.start_accept();
m_Run = true;
m_Thread = new std::thread([&] (){
while(m_Run) {
if (!m_Run.load())
{
m_Run.store(true);
m_Server.listen(boost::asio::ip::address::from_string(m_Addr), m_Port);
m_Server.start_accept();
m_Run = true;
m_Thread = new std::thread([&] (){
while (m_Run.load(std::memory_order_acquire)) {
try {
m_Server.run();
} catch( std::exception & ex) {
LogPrint(eLogError, "Websocks runtime exception: ", ex.what());
}
}
});
m_Dest->Start();
});
m_Dest->Start();
}
}
void Stop()
{
for(const auto & conn : m_Conns)
conn->Close();
if (m_Run.load())
{
for(const auto & conn : m_Conns)
conn->Close();
m_Dest->Stop();
m_Run = false;
m_Server.stop();
if(m_Thread) {
m_Thread->join();
delete m_Thread;
m_Dest->Stop();
m_Run.store(false);
m_Server.stop();
if(m_Thread) {
m_Thread->join();
delete m_Thread;
}
m_Thread = nullptr;
}
m_Thread = nullptr;
}
boost::asio::ip::tcp::endpoint GetLocalEndpoint()
@ -140,7 +147,7 @@ namespace client
private:
std::vector<WebSocksConn_ptr> m_Conns;
bool m_Run;
std::atomic_bool m_Run;
ServerImpl m_Server;
std::string m_Addr;
int m_Port;

View file

@ -30,7 +30,7 @@ namespace i2p
public:
WebsocketServerImpl(const std::string & addr, int port) :
m_run(false),
m_IsRunning(false),
m_ws_thread(nullptr),
m_ev_thread(nullptr),
m_WebsocketTicker(m_Service)
@ -48,10 +48,12 @@ namespace i2p
}
void Start() {
m_run = true;
m_server.start_accept();
m_ws_thread = new std::thread([&] () {
while(m_run) {
if (!m_IsRunning.load())
{
m_IsRunning.store(true);
m_server.start_accept();
m_ws_thread = new std::thread([&] () {
while(m_IsRunning.load(std::memory_order_acquire)) {
try {
m_server.run();
} catch (std::exception & e ) {
@ -59,8 +61,8 @@ namespace i2p
}
}
});
m_ev_thread = new std::thread([&] () {
while(m_run) {
m_ev_thread = new std::thread([&] () {
while(m_IsRunning.load(std::memory_order_acquire)) {
try {
m_Service.run();
break;
@ -69,25 +71,29 @@ namespace i2p
}
}
});
ScheduleTick();
ScheduleTick();
}
}
void Stop() {
m_run = false;
m_Service.stop();
m_server.stop();
if (m_IsRunning.load())
{
m_IsRunning.store(false);
m_Service.stop();
m_server.stop();
if(m_ev_thread) {
m_ev_thread->join();
delete m_ev_thread;
}
m_ev_thread = nullptr;
if(m_ev_thread) {
m_ev_thread->join();
delete m_ev_thread;
}
m_ev_thread = nullptr;
if(m_ws_thread) {
m_ws_thread->join();
delete m_ws_thread;
if(m_ws_thread) {
m_ws_thread->join();
delete m_ws_thread;
}
m_ws_thread = nullptr;
}
m_ws_thread = nullptr;
}
void ConnOpened(ServerConn c)
@ -158,7 +164,7 @@ namespace i2p
private:
typedef std::set<ServerConn, std::owner_less<ServerConn> > ConnList;
bool m_run;
std::atomic_bool m_IsRunning;
std::thread * m_ws_thread;
std::thread * m_ev_thread;
std::mutex m_connsMutex;