diff --git a/src/App.cpp b/src/App.cpp index 95065900..aff9ee95 100644 --- a/src/App.cpp +++ b/src/App.cpp @@ -123,10 +123,10 @@ int App::exec() void App::close() { - uv_signal_stop(&m_signal); - m_network->stop(); Workers::stop(); + + uv_stop(uv_default_loop()); } @@ -150,5 +150,6 @@ void App::onSignal(uv_signal_t *handle, int signum) break; } + uv_signal_stop(handle); m_self->close(); } diff --git a/src/net/Network.cpp b/src/net/Network.cpp index 59ce83d7..86c5ee7a 100644 --- a/src/net/Network.cpp +++ b/src/net/Network.cpp @@ -127,7 +127,7 @@ void Network::onPause(IStrategy *strategy) } if (!m_strategy->isActive()) { - LOG_ERR("no active pools, pause mining"); + LOG_ERR("no active pools, stop mining"); return Workers::pause(); } } diff --git a/src/workers/DoubleWorker.cpp b/src/workers/DoubleWorker.cpp index b3b606ca..243ba1b9 100644 --- a/src/workers/DoubleWorker.cpp +++ b/src/workers/DoubleWorker.cpp @@ -62,7 +62,7 @@ DoubleWorker::~DoubleWorker() void DoubleWorker::start() { - while (true) { + while (Workers::sequence() > 0) { if (Workers::isPaused()) { do { std::this_thread::sleep_for(std::chrono::milliseconds(200)); diff --git a/src/workers/Handle.cpp b/src/workers/Handle.cpp index 9cebd097..8b748cd3 100644 --- a/src/workers/Handle.cpp +++ b/src/workers/Handle.cpp @@ -34,6 +34,12 @@ Handle::Handle(int threadId, int threads, int64_t affinity) : } +void Handle::join() +{ + uv_thread_join(&m_thread); +} + + void Handle::start(void (*callback) (void *)) { uv_thread_create(&m_thread, callback, this); diff --git a/src/workers/Handle.h b/src/workers/Handle.h index 6ec3d240..a663fbe9 100644 --- a/src/workers/Handle.h +++ b/src/workers/Handle.h @@ -36,6 +36,7 @@ class Handle { public: Handle(int threadId, int threads, int64_t affinity); + void join(); void start(void (*callback) (void *)); inline int threadId() const { return m_threadId; } diff --git a/src/workers/SingleWorker.cpp b/src/workers/SingleWorker.cpp index 764293b2..58c69e7f 100644 --- a/src/workers/SingleWorker.cpp +++ b/src/workers/SingleWorker.cpp @@ -38,7 +38,7 @@ SingleWorker::SingleWorker(Handle *handle) void SingleWorker::start() { - while (true) { + while (Workers::sequence() > 0) { if (Workers::isPaused()) { do { std::this_thread::sleep_for(std::chrono::milliseconds(200)); diff --git a/src/workers/Workers.cpp b/src/workers/Workers.cpp index 43111778..e6717bbc 100644 --- a/src/workers/Workers.cpp +++ b/src/workers/Workers.cpp @@ -100,7 +100,7 @@ void Workers::start(int64_t affinity) uv_mutex_init(&m_mutex); uv_rwlock_init(&m_rwlock); - m_sequence = 0; + m_sequence = 1; m_paused = 1; uv_async_init(uv_default_loop(), &m_async, Workers::onResult); @@ -121,6 +121,11 @@ void Workers::stop() m_hashrate->stop(); uv_close(reinterpret_cast(&m_async), nullptr); + m_sequence = 0; + + for (size_t i = 0; i < m_workers.size(); ++i) { + m_workers[i]->join(); + } } diff --git a/src/xmrig.cpp b/src/xmrig.cpp index 4b4afcd2..48362ada 100644 --- a/src/xmrig.cpp +++ b/src/xmrig.cpp @@ -25,7 +25,7 @@ int main(int argc, char **argv) { - auto app = new App(argc, argv); + App app(argc, argv); - return app->exec(); + return app.exec(); }