From a3988374f0288f96503156c785f72f8e23c85820 Mon Sep 17 00:00:00 2001 From: XMRig Date: Tue, 18 Jul 2017 05:20:36 +0300 Subject: [PATCH] Fixed graceful shutdown. --- src/App.cpp | 5 ++++- src/interfaces/IStrategy.h | 1 + src/net/Client.cpp | 2 ++ src/net/Network.cpp | 10 ++++++++++ src/net/Network.h | 1 + src/net/strategies/DonateStrategy.cpp | 11 +++++++++-- src/net/strategies/DonateStrategy.h | 3 ++- src/net/strategies/FailoverStrategy.cpp | 8 ++++++++ src/net/strategies/FailoverStrategy.h | 1 + src/net/strategies/SinglePoolStrategy.cpp | 6 ++++++ src/net/strategies/SinglePoolStrategy.h | 1 + src/workers/Hashrate.cpp | 6 ++++++ src/workers/Hashrate.h | 1 + src/workers/Workers.cpp | 9 +++++++++ src/workers/Workers.h | 1 + 15 files changed, 62 insertions(+), 4 deletions(-) diff --git a/src/App.cpp b/src/App.cpp index 9d970d12..95065900 100644 --- a/src/App.cpp +++ b/src/App.cpp @@ -123,7 +123,10 @@ int App::exec() void App::close() { - uv_stop(uv_default_loop()); + uv_signal_stop(&m_signal); + + m_network->stop(); + Workers::stop(); } diff --git a/src/interfaces/IStrategy.h b/src/interfaces/IStrategy.h index a57e8f20..b7f5d652 100644 --- a/src/interfaces/IStrategy.h +++ b/src/interfaces/IStrategy.h @@ -40,6 +40,7 @@ public: virtual int64_t submit(const JobResult &result) = 0; virtual void connect() = 0; virtual void resume() = 0; + virtual void stop() = 0; }; diff --git a/src/net/Client.cpp b/src/net/Client.cpp index fef65b8c..b9ef5fd3 100644 --- a/src/net/Client.cpp +++ b/src/net/Client.cpp @@ -135,6 +135,8 @@ void Client::connect(const Url *url) void Client::disconnect() { + uv_timer_stop(&m_keepAliveTimer); + uv_timer_stop(&m_responseTimer); uv_timer_stop(&m_retriesTimer); m_failures = -1; diff --git a/src/net/Network.cpp b/src/net/Network.cpp index dab06492..1856f063 100644 --- a/src/net/Network.cpp +++ b/src/net/Network.cpp @@ -76,6 +76,16 @@ void Network::connect() } +void Network::stop() +{ + if (m_donate) { + m_donate->stop(); + } + + m_strategy->stop(); +} + + void Network::onActive(Client *client) { if (client->id() == -1) { diff --git a/src/net/Network.h b/src/net/Network.h index bb19fa35..21046df9 100644 --- a/src/net/Network.h +++ b/src/net/Network.h @@ -45,6 +45,7 @@ public: ~Network(); void connect(); + void stop(); static char *userAgent(); diff --git a/src/net/strategies/DonateStrategy.cpp b/src/net/strategies/DonateStrategy.cpp index e46e013f..11951ec2 100644 --- a/src/net/strategies/DonateStrategy.cpp +++ b/src/net/strategies/DonateStrategy.cpp @@ -62,6 +62,13 @@ void DonateStrategy::connect() } +void DonateStrategy::stop() +{ + uv_timer_stop(&m_timer); + m_client->disconnect(); +} + + void DonateStrategy::onClose(Client *client, int failures) { } @@ -96,7 +103,7 @@ void DonateStrategy::idle() } -void DonateStrategy::stop() +void DonateStrategy::suspend() { m_client->disconnect(); @@ -115,5 +122,5 @@ void DonateStrategy::onTimer(uv_timer_t *handle) return strategy->connect(); } - strategy->stop(); + strategy->suspend(); } diff --git a/src/net/strategies/DonateStrategy.h b/src/net/strategies/DonateStrategy.h index 3b9ac78d..1c7597ef 100644 --- a/src/net/strategies/DonateStrategy.h +++ b/src/net/strategies/DonateStrategy.h @@ -48,6 +48,7 @@ public: int64_t submit(const JobResult &result) override; void connect() override; + void stop() override; protected: void onClose(Client *client, int failures) override; @@ -57,7 +58,7 @@ protected: private: void idle(); - void stop(); + void suspend(); static void onTimer(uv_timer_t *handle); diff --git a/src/net/strategies/FailoverStrategy.cpp b/src/net/strategies/FailoverStrategy.cpp index 335165f2..13ba964c 100644 --- a/src/net/strategies/FailoverStrategy.cpp +++ b/src/net/strategies/FailoverStrategy.cpp @@ -61,6 +61,14 @@ void FailoverStrategy::resume() } +void FailoverStrategy::stop() +{ + for (size_t i = 0; i < m_pools.size(); ++i) { + m_pools[i]->disconnect(); + } +} + + void FailoverStrategy::onClose(Client *client, int failures) { if (failures == -1) { diff --git a/src/net/strategies/FailoverStrategy.h b/src/net/strategies/FailoverStrategy.h index 7d971ce1..f0fa0514 100644 --- a/src/net/strategies/FailoverStrategy.h +++ b/src/net/strategies/FailoverStrategy.h @@ -48,6 +48,7 @@ public: int64_t submit(const JobResult &result) override; void connect() override; void resume() override; + void stop() override; protected: void onClose(Client *client, int failures) override; diff --git a/src/net/strategies/SinglePoolStrategy.cpp b/src/net/strategies/SinglePoolStrategy.cpp index 0354ec5e..b1a6941e 100644 --- a/src/net/strategies/SinglePoolStrategy.cpp +++ b/src/net/strategies/SinglePoolStrategy.cpp @@ -60,6 +60,12 @@ void SinglePoolStrategy::resume() } +void SinglePoolStrategy::stop() +{ + m_client->disconnect(); +} + + void SinglePoolStrategy::onClose(Client *client, int failures) { if (!isActive()) { diff --git a/src/net/strategies/SinglePoolStrategy.h b/src/net/strategies/SinglePoolStrategy.h index 8d6d80c7..51b1a88d 100644 --- a/src/net/strategies/SinglePoolStrategy.h +++ b/src/net/strategies/SinglePoolStrategy.h @@ -45,6 +45,7 @@ public: int64_t submit(const JobResult &result) override; void connect() override; void resume() override; + void stop() override; protected: void onClose(Client *client, int failures) override; diff --git a/src/workers/Hashrate.cpp b/src/workers/Hashrate.cpp index 40b25977..4c373156 100644 --- a/src/workers/Hashrate.cpp +++ b/src/workers/Hashrate.cpp @@ -161,6 +161,12 @@ void Hashrate::print() } +void Hashrate::stop() +{ + uv_timer_stop(&m_timer); +} + + void Hashrate::updateHighest() { double highest = calc(2500); diff --git a/src/workers/Hashrate.h b/src/workers/Hashrate.h index 9ba0b0bf..ca894dcb 100644 --- a/src/workers/Hashrate.h +++ b/src/workers/Hashrate.h @@ -37,6 +37,7 @@ public: double calc(size_t threadId, size_t ms) const; void add(size_t threadId, uint64_t count, uint64_t timestamp); void print(); + void stop(); void updateHighest(); inline double highest() const { return m_highest; } diff --git a/src/workers/Workers.cpp b/src/workers/Workers.cpp index 18e38edd..43111778 100644 --- a/src/workers/Workers.cpp +++ b/src/workers/Workers.cpp @@ -115,6 +115,15 @@ void Workers::start(int64_t affinity) } +void Workers::stop() +{ + uv_timer_stop(&m_timer); + m_hashrate->stop(); + + uv_close(reinterpret_cast(&m_async), nullptr); +} + + void Workers::submit(const JobResult &result) { uv_mutex_lock(&m_mutex); diff --git a/src/workers/Workers.h b/src/workers/Workers.h index 582d56e7..850a909e 100644 --- a/src/workers/Workers.h +++ b/src/workers/Workers.h @@ -46,6 +46,7 @@ public: static void setEnabled(bool enabled); static void setJob(const Job &job); static void start(int64_t affinity); + static void stop(); static void submit(const JobResult &result); static inline bool isEnabled() { return m_enabled; }