From 3d41629170afcfe26d08d4c1b8ce97e38285fea6 Mon Sep 17 00:00:00 2001 From: xmrig Date: Thu, 15 Mar 2018 01:32:09 +0700 Subject: [PATCH 01/25] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 0330f83f..acaf178f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,7 @@ # XMRig + +:warning: **You must update miners to version 2.5 before March 28 due [Monero PoW change](https://getmonero.org/2018/02/11/PoW-change-and-key-reuse.html).** + [![Github All Releases](https://img.shields.io/github/downloads/xmrig/xmrig/total.svg)](https://github.com/xmrig/xmrig/releases) [![GitHub release](https://img.shields.io/github/release/xmrig/xmrig/all.svg)](https://github.com/xmrig/xmrig/releases) [![GitHub Release Date](https://img.shields.io/github/release-date-pre/xmrig/xmrig.svg)](https://github.com/xmrig/xmrig/releases) From 7ab81ef19a5f77900b9a89efe85eb86d96399003 Mon Sep 17 00:00:00 2001 From: XMRig Date: Sat, 17 Mar 2018 01:07:53 +0700 Subject: [PATCH 02/25] #456 Don't show error "JSON decode failed" in quiet mode. --- src/net/Client.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/net/Client.cpp b/src/net/Client.cpp index f6543b4e..cb1a53f8 100644 --- a/src/net/Client.cpp +++ b/src/net/Client.cpp @@ -407,7 +407,10 @@ void Client::parse(char *line, size_t len) LOG_DEBUG("[%s:%u] received (%d bytes): \"%s\"", m_url.host(), m_url.port(), len, line); if (len < 32 || line[0] != '{') { - LOG_ERR("[%s:%u] JSON decode failed", m_url.host(), m_url.port()); + if (!m_quiet) { + LOG_ERR("[%s:%u] JSON decode failed", m_url.host(), m_url.port()); + } + return; } From a2f747fb0c4b8282115302832d62b7bba5532652 Mon Sep 17 00:00:00 2001 From: XMRig Date: Sat, 17 Mar 2018 04:16:08 +0700 Subject: [PATCH 03/25] Pass all options to network strategies in constructor. --- src/net/Network.cpp | 6 +++--- src/net/strategies/DonateStrategy.cpp | 12 +++++------- src/net/strategies/DonateStrategy.h | 2 +- src/net/strategies/FailoverStrategy.cpp | 13 +++++++------ src/net/strategies/FailoverStrategy.h | 8 +++++--- src/net/strategies/SinglePoolStrategy.cpp | 9 ++++----- src/net/strategies/SinglePoolStrategy.h | 6 +++--- 7 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/net/Network.cpp b/src/net/Network.cpp index e0f65497..d2cf8b1a 100644 --- a/src/net/Network.cpp +++ b/src/net/Network.cpp @@ -55,14 +55,14 @@ Network::Network(const Options *options) : const std::vector &pools = options->pools(); if (pools.size() > 1) { - m_strategy = new FailoverStrategy(pools, Platform::userAgent(), this); + m_strategy = new FailoverStrategy(pools, options->retryPause(), options->retries(), Platform::userAgent(), this); } else { - m_strategy = new SinglePoolStrategy(pools.front(), Platform::userAgent(), this); + m_strategy = new SinglePoolStrategy(pools.front(), options->retryPause(), Platform::userAgent(), this); } if (m_options->donateLevel() > 0) { - m_donate = new DonateStrategy(Platform::userAgent(), this); + m_donate = new DonateStrategy(options->donateLevel(), options->pools().front()->user(), options->algo(), Platform::userAgent(), this); } m_timer.data = this; diff --git a/src/net/strategies/DonateStrategy.cpp b/src/net/strategies/DonateStrategy.cpp index 84d1e4da..aaab222b 100644 --- a/src/net/strategies/DonateStrategy.cpp +++ b/src/net/strategies/DonateStrategy.cpp @@ -26,7 +26,6 @@ #include "net/Client.h" #include "net/Job.h" #include "net/strategies/DonateStrategy.h" -#include "Options.h" #include "xmrig.h" @@ -36,24 +35,23 @@ extern "C" } -DonateStrategy::DonateStrategy(const char *agent, IStrategyListener *listener) : +DonateStrategy::DonateStrategy(int level, const char *user, int algo, const char *agent, IStrategyListener *listener) : m_active(false), - m_donateTime(Options::i()->donateLevel() * 60 * 1000), - m_idleTime((100 - Options::i()->donateLevel()) * 60 * 1000), + m_donateTime(level * 60 * 1000), + m_idleTime((100 - level) * 60 * 1000), m_listener(listener) { uint8_t hash[200]; char userId[65] = { 0 }; - const char *user = Options::i()->pools().front()->user(); keccak(reinterpret_cast(user), static_cast(strlen(user)), hash, sizeof(hash)); Job::toHex(hash, 32, userId); - Url *url = new Url("thanks.xmrig.com", Options::i()->algo() == xmrig::ALGO_CRYPTONIGHT_LITE ? 5555 : 80, userId, nullptr, false, true); + Url *url = new Url("thanks.xmrig.com", algo == xmrig::ALGO_CRYPTONIGHT_LITE ? 5555 : 80, userId, nullptr, false, true); m_client = new Client(-1, agent, this); m_client->setUrl(url); - m_client->setRetryPause(Options::i()->retryPause() * 1000); + m_client->setRetryPause(1000); m_client->setQuiet(true); delete url; diff --git a/src/net/strategies/DonateStrategy.h b/src/net/strategies/DonateStrategy.h index 07011053..52e3a38d 100644 --- a/src/net/strategies/DonateStrategy.h +++ b/src/net/strategies/DonateStrategy.h @@ -40,7 +40,7 @@ class Url; class DonateStrategy : public IStrategy, public IClientListener { public: - DonateStrategy(const char *agent, IStrategyListener *listener); + DonateStrategy(int level, const char *user, int algo, const char *agent, IStrategyListener *listener); public: inline bool isActive() const override { return m_active; } diff --git a/src/net/strategies/FailoverStrategy.cpp b/src/net/strategies/FailoverStrategy.cpp index 47d390b0..db449ccc 100644 --- a/src/net/strategies/FailoverStrategy.cpp +++ b/src/net/strategies/FailoverStrategy.cpp @@ -4,8 +4,8 @@ * Copyright 2014 Lucas Jones * Copyright 2014-2016 Wolf9466 * Copyright 2016 Jay D Dee - * Copyright 2016-2017 XMRig - * + * Copyright 2017-2018 XMR-Stak , + * Copyright 2016-2018 XMRig , * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -25,10 +25,11 @@ #include "interfaces/IStrategyListener.h" #include "net/Client.h" #include "net/strategies/FailoverStrategy.h" -#include "Options.h" -FailoverStrategy::FailoverStrategy(const std::vector &urls, const char *agent, IStrategyListener *listener) : +FailoverStrategy::FailoverStrategy(const std::vector &urls, int retryPause, int retries, const char *agent, IStrategyListener *listener) : + m_retries(retries), + m_retryPause(retryPause), m_active(-1), m_index(0), m_listener(listener) @@ -93,7 +94,7 @@ void FailoverStrategy::onClose(Client *client, int failures) m_listener->onPause(this); } - if (m_index == 0 && failures < Options::i()->retries()) { + if (m_index == 0 && failures < m_retries) { return; } @@ -142,7 +143,7 @@ void FailoverStrategy::add(const Url *url, const char *agent) { Client *client = new Client((int) m_pools.size(), agent, this); client->setUrl(url); - client->setRetryPause(Options::i()->retryPause() * 1000); + client->setRetryPause(m_retryPause * 1000); m_pools.push_back(client); } diff --git a/src/net/strategies/FailoverStrategy.h b/src/net/strategies/FailoverStrategy.h index 963d3157..e29c7d62 100644 --- a/src/net/strategies/FailoverStrategy.h +++ b/src/net/strategies/FailoverStrategy.h @@ -4,8 +4,8 @@ * Copyright 2014 Lucas Jones * Copyright 2014-2016 Wolf9466 * Copyright 2016 Jay D Dee - * Copyright 2016-2017 XMRig - * + * Copyright 2017-2018 XMR-Stak , + * Copyright 2016-2018 XMRig , * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -40,7 +40,7 @@ class Url; class FailoverStrategy : public IStrategy, public IClientListener { public: - FailoverStrategy(const std::vector &urls, const char *agent, IStrategyListener *listener); + FailoverStrategy(const std::vector &urls, int retryPause, int retries, const char *agent, IStrategyListener *listener); public: inline bool isActive() const override { return m_active >= 0; } @@ -60,6 +60,8 @@ protected: private: void add(const Url *url, const char *agent); + const int m_retries; + const int m_retryPause; int m_active; int m_index; IStrategyListener *m_listener; diff --git a/src/net/strategies/SinglePoolStrategy.cpp b/src/net/strategies/SinglePoolStrategy.cpp index 997dc00b..2671ba72 100644 --- a/src/net/strategies/SinglePoolStrategy.cpp +++ b/src/net/strategies/SinglePoolStrategy.cpp @@ -4,8 +4,8 @@ * Copyright 2014 Lucas Jones * Copyright 2014-2016 Wolf9466 * Copyright 2016 Jay D Dee - * Copyright 2016-2017 XMRig - * + * Copyright 2017-2018 XMR-Stak , + * Copyright 2016-2018 XMRig , * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -25,16 +25,15 @@ #include "interfaces/IStrategyListener.h" #include "net/Client.h" #include "net/strategies/SinglePoolStrategy.h" -#include "Options.h" -SinglePoolStrategy::SinglePoolStrategy(const Url *url, const char *agent, IStrategyListener *listener) : +SinglePoolStrategy::SinglePoolStrategy(const Url *url, int retryPause, const char *agent, IStrategyListener *listener) : m_active(false), m_listener(listener) { m_client = new Client(0, agent, this); m_client->setUrl(url); - m_client->setRetryPause(Options::i()->retryPause() * 1000); + m_client->setRetryPause(retryPause * 1000); } diff --git a/src/net/strategies/SinglePoolStrategy.h b/src/net/strategies/SinglePoolStrategy.h index 95e21547..d444772e 100644 --- a/src/net/strategies/SinglePoolStrategy.h +++ b/src/net/strategies/SinglePoolStrategy.h @@ -4,8 +4,8 @@ * Copyright 2014 Lucas Jones * Copyright 2014-2016 Wolf9466 * Copyright 2016 Jay D Dee - * Copyright 2016-2017 XMRig - * + * Copyright 2017-2018 XMR-Stak , + * Copyright 2016-2018 XMRig , * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -37,7 +37,7 @@ class Url; class SinglePoolStrategy : public IStrategy, public IClientListener { public: - SinglePoolStrategy(const Url *url, const char *agent, IStrategyListener *listener); + SinglePoolStrategy(const Url *url, int retryPause, const char *agent, IStrategyListener *listener); public: inline bool isActive() const override { return m_active; } From c46c019c8399e0c3f4d2d77324589034dc40dcfc Mon Sep 17 00:00:00 2001 From: XMRig Date: Sat, 17 Mar 2018 05:03:14 +0700 Subject: [PATCH 04/25] Unify network strategies with upcoming proxy. --- src/interfaces/IStrategy.h | 5 ++- src/interfaces/IStrategyListener.h | 12 +++--- src/net/Network.cpp | 17 ++++---- src/net/Network.h | 10 ++--- src/net/strategies/DonateStrategy.cpp | 16 +++++--- src/net/strategies/DonateStrategy.h | 3 +- src/net/strategies/FailoverStrategy.cpp | 47 +++++++++++++++++++---- src/net/strategies/FailoverStrategy.h | 8 +++- src/net/strategies/SinglePoolStrategy.cpp | 32 ++++++++++++--- src/net/strategies/SinglePoolStrategy.h | 5 ++- 10 files changed, 110 insertions(+), 45 deletions(-) diff --git a/src/interfaces/IStrategy.h b/src/interfaces/IStrategy.h index 660529ea..6e915401 100644 --- a/src/interfaces/IStrategy.h +++ b/src/interfaces/IStrategy.h @@ -4,8 +4,8 @@ * Copyright 2014 Lucas Jones * Copyright 2014-2016 Wolf9466 * Copyright 2016 Jay D Dee - * Copyright 2016-2017 XMRig - * + * Copyright 2017-2018 XMR-Stak , + * Copyright 2016-2018 XMRig , * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -39,6 +39,7 @@ public: virtual bool isActive() const = 0; virtual int64_t submit(const JobResult &result) = 0; virtual void connect() = 0; + virtual void release() = 0; virtual void resume() = 0; virtual void stop() = 0; virtual void tick(uint64_t now) = 0; diff --git a/src/interfaces/IStrategyListener.h b/src/interfaces/IStrategyListener.h index 60f95734..9f2c4487 100644 --- a/src/interfaces/IStrategyListener.h +++ b/src/interfaces/IStrategyListener.h @@ -4,8 +4,8 @@ * Copyright 2014 Lucas Jones * Copyright 2014-2016 Wolf9466 * Copyright 2016 Jay D Dee - * Copyright 2016-2017 XMRig - * + * Copyright 2017-2018 XMR-Stak , + * Copyright 2016-2018 XMRig , * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -39,10 +39,10 @@ class IStrategyListener public: virtual ~IStrategyListener() {} - virtual void onActive(Client *client) = 0; - virtual void onJob(Client *client, const Job &job) = 0; - virtual void onPause(IStrategy *strategy) = 0; - virtual void onResultAccepted(Client *client, const SubmitResult &result, const char *error) = 0; + virtual void onActive(IStrategy *strategy, Client *client) = 0; + virtual void onJob(IStrategy *strategy, Client *client, const Job &job) = 0; + virtual void onPause(IStrategy *strategy) = 0; + virtual void onResultAccepted(IStrategy *strategy, Client *client, const SubmitResult &result, const char *error) = 0; }; diff --git a/src/net/Network.cpp b/src/net/Network.cpp index d2cf8b1a..978bbf27 100644 --- a/src/net/Network.cpp +++ b/src/net/Network.cpp @@ -4,8 +4,8 @@ * Copyright 2014 Lucas Jones * Copyright 2014-2016 Wolf9466 * Copyright 2016 Jay D Dee - * Copyright 2016-2017 XMRig - * + * Copyright 2017-2018 XMR-Stak , + * Copyright 2016-2018 XMRig , * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -40,7 +40,6 @@ #include "net/SubmitResult.h" #include "net/Url.h" #include "Options.h" -#include "Platform.h" #include "workers/Workers.h" @@ -55,14 +54,14 @@ Network::Network(const Options *options) : const std::vector &pools = options->pools(); if (pools.size() > 1) { - m_strategy = new FailoverStrategy(pools, options->retryPause(), options->retries(), Platform::userAgent(), this); + m_strategy = new FailoverStrategy(pools, options->retryPause(), options->retries(), this); } else { - m_strategy = new SinglePoolStrategy(pools.front(), options->retryPause(), Platform::userAgent(), this); + m_strategy = new SinglePoolStrategy(pools.front(), options->retryPause(), this); } if (m_options->donateLevel() > 0) { - m_donate = new DonateStrategy(options->donateLevel(), options->pools().front()->user(), options->algo(), Platform::userAgent(), this); + m_donate = new DonateStrategy(options->donateLevel(), options->pools().front()->user(), options->algo(), this); } m_timer.data = this; @@ -93,7 +92,7 @@ void Network::stop() } -void Network::onActive(Client *client) +void Network::onActive(IStrategy *strategy, Client *client) { if (client->id() == -1) { LOG_NOTICE("dev donate started"); @@ -106,7 +105,7 @@ void Network::onActive(Client *client) } -void Network::onJob(Client *client, const Job &job) +void Network::onJob(IStrategy *strategy, Client *client, const Job &job) { if (m_donate && m_donate->isActive() && client->id() != -1) { return; @@ -142,7 +141,7 @@ void Network::onPause(IStrategy *strategy) } -void Network::onResultAccepted(Client *client, const SubmitResult &result, const char *error) +void Network::onResultAccepted(IStrategy *strategy, Client *client, const SubmitResult &result, const char *error) { m_state.add(result, error); diff --git a/src/net/Network.h b/src/net/Network.h index fe13d9b7..f7eb3ff2 100644 --- a/src/net/Network.h +++ b/src/net/Network.h @@ -4,8 +4,8 @@ * Copyright 2014 Lucas Jones * Copyright 2014-2016 Wolf9466 * Copyright 2016 Jay D Dee - * Copyright 2016-2017 XMRig - * + * Copyright 2017-2018 XMR-Stak , + * Copyright 2016-2018 XMRig , * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -49,11 +49,11 @@ public: void stop(); protected: - void onActive(Client *client) override; - void onJob(Client *client, const Job &job) override; + void onActive(IStrategy *strategy, Client *client) override; + void onJob(IStrategy *strategy, Client *client, const Job &job) override; void onJobResult(const JobResult &result) override; void onPause(IStrategy *strategy) override; - void onResultAccepted(Client *client, const SubmitResult &result, const char *error) override; + void onResultAccepted(IStrategy *strategy, Client *client, const SubmitResult &result, const char *error) override; private: constexpr static int kTickInterval = 1 * 1000; diff --git a/src/net/strategies/DonateStrategy.cpp b/src/net/strategies/DonateStrategy.cpp index aaab222b..55de9bdb 100644 --- a/src/net/strategies/DonateStrategy.cpp +++ b/src/net/strategies/DonateStrategy.cpp @@ -26,6 +26,7 @@ #include "net/Client.h" #include "net/Job.h" #include "net/strategies/DonateStrategy.h" +#include "Platform.h" #include "xmrig.h" @@ -35,7 +36,7 @@ extern "C" } -DonateStrategy::DonateStrategy(int level, const char *user, int algo, const char *agent, IStrategyListener *listener) : +DonateStrategy::DonateStrategy(int level, const char *user, int algo, IStrategyListener *listener) : m_active(false), m_donateTime(level * 60 * 1000), m_idleTime((100 - level) * 60 * 1000), @@ -49,7 +50,7 @@ DonateStrategy::DonateStrategy(int level, const char *user, int algo, const char Url *url = new Url("thanks.xmrig.com", algo == xmrig::ALGO_CRYPTONIGHT_LITE ? 5555 : 80, userId, nullptr, false, true); - m_client = new Client(-1, agent, this); + m_client = new Client(-1, Platform::userAgent(), this); m_client->setUrl(url); m_client->setRetryPause(1000); m_client->setQuiet(true); @@ -75,6 +76,11 @@ void DonateStrategy::connect() } +void DonateStrategy::release() +{ +} + + void DonateStrategy::stop() { uv_timer_stop(&m_timer); @@ -95,7 +101,7 @@ void DonateStrategy::onClose(Client *client, int failures) void DonateStrategy::onJobReceived(Client *client, const Job &job) { - m_listener->onJob(client, job); + m_listener->onJob(this, client, job); } @@ -106,13 +112,13 @@ void DonateStrategy::onLoginSuccess(Client *client) } m_active = true; - m_listener->onActive(client); + m_listener->onActive(this, client); } void DonateStrategy::onResultAccepted(Client *client, const SubmitResult &result, const char *error) { - m_listener->onResultAccepted(client, result, error); + m_listener->onResultAccepted(this, client, result, error); } diff --git a/src/net/strategies/DonateStrategy.h b/src/net/strategies/DonateStrategy.h index 52e3a38d..f805bc78 100644 --- a/src/net/strategies/DonateStrategy.h +++ b/src/net/strategies/DonateStrategy.h @@ -40,7 +40,7 @@ class Url; class DonateStrategy : public IStrategy, public IClientListener { public: - DonateStrategy(int level, const char *user, int algo, const char *agent, IStrategyListener *listener); + DonateStrategy(int level, const char *user, int algo, IStrategyListener *listener); public: inline bool isActive() const override { return m_active; } @@ -48,6 +48,7 @@ public: int64_t submit(const JobResult &result) override; void connect() override; + void release() override; void stop() override; void tick(uint64_t now) override; diff --git a/src/net/strategies/FailoverStrategy.cpp b/src/net/strategies/FailoverStrategy.cpp index db449ccc..5ead16c1 100644 --- a/src/net/strategies/FailoverStrategy.cpp +++ b/src/net/strategies/FailoverStrategy.cpp @@ -25,17 +25,28 @@ #include "interfaces/IStrategyListener.h" #include "net/Client.h" #include "net/strategies/FailoverStrategy.h" +#include "Platform.h" -FailoverStrategy::FailoverStrategy(const std::vector &urls, int retryPause, int retries, const char *agent, IStrategyListener *listener) : +FailoverStrategy::FailoverStrategy(const std::vector &urls, int retryPause, int retries, IStrategyListener *listener) : + m_release(false), m_retries(retries), m_retryPause(retryPause), m_active(-1), m_index(0), + m_remaining(0), m_listener(listener) { for (const Url *url : urls) { - add(url, agent); + add(url); + } +} + + +FailoverStrategy::~FailoverStrategy() +{ + for (Client *client : m_pools) { + delete client; } } @@ -52,13 +63,25 @@ void FailoverStrategy::connect() } +void FailoverStrategy::release() +{ + m_release = true; + + for (size_t i = 0; i < m_pools.size(); ++i) { + if (m_pools[i]->disconnect()) { + m_remaining++; + } + } +} + + void FailoverStrategy::resume() { if (!isActive()) { return; } - m_listener->onJob( m_pools[m_active], m_pools[m_active]->job()); + m_listener->onJob(this, m_pools[m_active], m_pools[m_active]->job()); } @@ -86,6 +109,14 @@ void FailoverStrategy::tick(uint64_t now) void FailoverStrategy::onClose(Client *client, int failures) { if (failures == -1) { + if (m_release) { + m_remaining--; + + if (m_remaining == 0) { + delete this; + } + } + return; } @@ -107,7 +138,7 @@ void FailoverStrategy::onClose(Client *client, int failures) void FailoverStrategy::onJobReceived(Client *client, const Job &job) { if (m_active == client->id()) { - m_listener->onJob(client, job); + m_listener->onJob(this, client, job); } } @@ -128,20 +159,20 @@ void FailoverStrategy::onLoginSuccess(Client *client) if (active >= 0 && active != m_active) { m_index = m_active = active; - m_listener->onActive(client); + m_listener->onActive(this, client); } } void FailoverStrategy::onResultAccepted(Client *client, const SubmitResult &result, const char *error) { - m_listener->onResultAccepted(client, result, error); + m_listener->onResultAccepted(this, client, result, error); } -void FailoverStrategy::add(const Url *url, const char *agent) +void FailoverStrategy::add(const Url *url) { - Client *client = new Client((int) m_pools.size(), agent, this); + Client *client = new Client((int) m_pools.size(), Platform::userAgent(), this); client->setUrl(url); client->setRetryPause(m_retryPause * 1000); diff --git a/src/net/strategies/FailoverStrategy.h b/src/net/strategies/FailoverStrategy.h index e29c7d62..7b7adf72 100644 --- a/src/net/strategies/FailoverStrategy.h +++ b/src/net/strategies/FailoverStrategy.h @@ -40,13 +40,15 @@ class Url; class FailoverStrategy : public IStrategy, public IClientListener { public: - FailoverStrategy(const std::vector &urls, int retryPause, int retries, const char *agent, IStrategyListener *listener); + FailoverStrategy(const std::vector &urls, int retryPause, int retries, IStrategyListener *listener); + ~FailoverStrategy(); public: inline bool isActive() const override { return m_active >= 0; } int64_t submit(const JobResult &result) override; void connect() override; + void release() override; void resume() override; void stop() override; void tick(uint64_t now) override; @@ -58,12 +60,14 @@ protected: void onResultAccepted(Client *client, const SubmitResult &result, const char *error) override; private: - void add(const Url *url, const char *agent); + void add(const Url *url); + bool m_release; const int m_retries; const int m_retryPause; int m_active; int m_index; + int m_remaining; IStrategyListener *m_listener; std::vector m_pools; }; diff --git a/src/net/strategies/SinglePoolStrategy.cpp b/src/net/strategies/SinglePoolStrategy.cpp index 2671ba72..fe37288b 100644 --- a/src/net/strategies/SinglePoolStrategy.cpp +++ b/src/net/strategies/SinglePoolStrategy.cpp @@ -25,18 +25,26 @@ #include "interfaces/IStrategyListener.h" #include "net/Client.h" #include "net/strategies/SinglePoolStrategy.h" +#include "Platform.h" -SinglePoolStrategy::SinglePoolStrategy(const Url *url, int retryPause, const char *agent, IStrategyListener *listener) : +SinglePoolStrategy::SinglePoolStrategy(const Url *url, int retryPause, IStrategyListener *listener) : m_active(false), + m_release(false), m_listener(listener) { - m_client = new Client(0, agent, this); + m_client = new Client(0, Platform::userAgent(), this); m_client->setUrl(url); m_client->setRetryPause(retryPause * 1000); } +SinglePoolStrategy::~SinglePoolStrategy() +{ + delete m_client; +} + + int64_t SinglePoolStrategy::submit(const JobResult &result) { return m_client->submit(result); @@ -49,13 +57,20 @@ void SinglePoolStrategy::connect() } +void SinglePoolStrategy::release() +{ + m_release = true; + m_client->disconnect(); +} + + void SinglePoolStrategy::resume() { if (!isActive()) { return; } - m_listener->onJob(m_client, m_client->job()); + m_listener->onJob(this, m_client, m_client->job()); } @@ -73,6 +88,11 @@ void SinglePoolStrategy::tick(uint64_t now) void SinglePoolStrategy::onClose(Client *client, int failures) { + if (m_release) { + delete this; + return; + } + if (!isActive()) { return; } @@ -84,18 +104,18 @@ void SinglePoolStrategy::onClose(Client *client, int failures) void SinglePoolStrategy::onJobReceived(Client *client, const Job &job) { - m_listener->onJob(client, job); + m_listener->onJob(this, client, job); } void SinglePoolStrategy::onLoginSuccess(Client *client) { m_active = true; - m_listener->onActive(client); + m_listener->onActive(this, client); } void SinglePoolStrategy::onResultAccepted(Client *client, const SubmitResult &result, const char *error) { - m_listener->onResultAccepted(client, result, error); + m_listener->onResultAccepted(this, client, result, error); } diff --git a/src/net/strategies/SinglePoolStrategy.h b/src/net/strategies/SinglePoolStrategy.h index d444772e..a918768c 100644 --- a/src/net/strategies/SinglePoolStrategy.h +++ b/src/net/strategies/SinglePoolStrategy.h @@ -37,13 +37,15 @@ class Url; class SinglePoolStrategy : public IStrategy, public IClientListener { public: - SinglePoolStrategy(const Url *url, int retryPause, const char *agent, IStrategyListener *listener); + SinglePoolStrategy(const Url *url, int retryPause, IStrategyListener *listener); + ~SinglePoolStrategy(); public: inline bool isActive() const override { return m_active; } int64_t submit(const JobResult &result) override; void connect() override; + void release() override; void resume() override; void stop() override; void tick(uint64_t now) override; @@ -56,6 +58,7 @@ protected: private: bool m_active; + bool m_release; Client *m_client; IStrategyListener *m_listener; }; From 1cf1d616c680f5ed75eab8fc6e39638f86ceecd2 Mon Sep 17 00:00:00 2001 From: XMRig Date: Sat, 17 Mar 2018 14:33:30 +0700 Subject: [PATCH 05/25] DonateStrategy now use FailoverStrategy internally and possible to use any other IStrategy. --- src/net/Job.h | 1 + src/net/Network.cpp | 10 ++-- src/net/Network.h | 2 +- src/net/strategies/DonateStrategy.cpp | 63 ++++++++++++++--------- src/net/strategies/DonateStrategy.h | 16 +++--- src/net/strategies/FailoverStrategy.cpp | 4 +- src/net/strategies/FailoverStrategy.h | 3 +- src/net/strategies/SinglePoolStrategy.cpp | 3 +- src/net/strategies/SinglePoolStrategy.h | 2 +- src/workers/Worker.cpp | 4 +- src/workers/Worker.h | 4 +- src/workers/Workers.cpp | 6 ++- src/workers/Workers.h | 2 +- 13 files changed, 73 insertions(+), 47 deletions(-) diff --git a/src/net/Job.h b/src/net/Job.h index d981ed37..0fe51aee 100644 --- a/src/net/Job.h +++ b/src/net/Job.h @@ -61,6 +61,7 @@ public: inline uint32_t diff() const { return (uint32_t) m_diff; } inline uint64_t target() const { return m_target; } inline void setNicehash(bool nicehash) { m_nicehash = nicehash; } + inline void setPoolId(int poolId) { m_poolId = poolId; } inline void setThreadId(int threadId) { m_threadId = threadId; } static bool fromHex(const char* in, unsigned int len, unsigned char* out); diff --git a/src/net/Network.cpp b/src/net/Network.cpp index 978bbf27..ede3f8b4 100644 --- a/src/net/Network.cpp +++ b/src/net/Network.cpp @@ -94,7 +94,7 @@ void Network::stop() void Network::onActive(IStrategy *strategy, Client *client) { - if (client->id() == -1) { + if (m_donate && m_donate == strategy) { LOG_NOTICE("dev donate started"); return; } @@ -107,11 +107,11 @@ void Network::onActive(IStrategy *strategy, Client *client) void Network::onJob(IStrategy *strategy, Client *client, const Job &job) { - if (m_donate && m_donate->isActive() && client->id() != -1) { + if (m_donate && m_donate->isActive() && m_donate != strategy) { return; } - setJob(client, job); + setJob(client, job, m_donate == strategy); } @@ -158,7 +158,7 @@ void Network::onResultAccepted(IStrategy *strategy, Client *client, const Submit } -void Network::setJob(Client *client, const Job &job) +void Network::setJob(Client *client, const Job &job, bool donate) { if (m_options->colors()) { LOG_INFO("\x1B[01;35mnew job\x1B[0m from \x1B[01;37m%s:%d\x1B[0m diff \x1B[01;37m%d", client->host(), client->port(), job.diff()); @@ -168,7 +168,7 @@ void Network::setJob(Client *client, const Job &job) } m_state.diff = job.diff(); - Workers::setJob(job); + Workers::setJob(job, donate); } diff --git a/src/net/Network.h b/src/net/Network.h index f7eb3ff2..fae5c563 100644 --- a/src/net/Network.h +++ b/src/net/Network.h @@ -58,7 +58,7 @@ protected: private: constexpr static int kTickInterval = 1 * 1000; - void setJob(Client *client, const Job &job); + void setJob(Client *client, const Job &job, bool donate); void tick(); static void onTick(uv_timer_t *handle); diff --git a/src/net/strategies/DonateStrategy.cpp b/src/net/strategies/DonateStrategy.cpp index 55de9bdb..cb28e122 100644 --- a/src/net/strategies/DonateStrategy.cpp +++ b/src/net/strategies/DonateStrategy.cpp @@ -26,6 +26,7 @@ #include "net/Client.h" #include "net/Job.h" #include "net/strategies/DonateStrategy.h" +#include "net/strategies/FailoverStrategy.h" #include "Platform.h" #include "xmrig.h" @@ -36,10 +37,14 @@ extern "C" } +const static char *kDonatePool = "thanks.xmrig.com"; + + DonateStrategy::DonateStrategy(int level, const char *user, int algo, IStrategyListener *listener) : m_active(false), m_donateTime(level * 60 * 1000), m_idleTime((100 - level) * 60 * 1000), + m_strategy(nullptr), m_listener(listener) { uint8_t hash[200]; @@ -48,14 +53,17 @@ DonateStrategy::DonateStrategy(int level, const char *user, int algo, IStrategyL keccak(reinterpret_cast(user), static_cast(strlen(user)), hash, sizeof(hash)); Job::toHex(hash, 32, userId); - Url *url = new Url("thanks.xmrig.com", algo == xmrig::ALGO_CRYPTONIGHT_LITE ? 5555 : 80, userId, nullptr, false, true); + if (algo == xmrig::ALGO_CRYPTONIGHT) { + m_pools.push_back(new Url(kDonatePool, 80, userId, nullptr, false, true)); + m_pools.push_back(new Url(kDonatePool, 443, userId, nullptr, false, true)); + m_pools.push_back(new Url("emergency.xmrig.com", 5555, "48edfHu7V9Z84YzzMa6fUueoELZ9ZRXq9VetWzYGzKt52XU5xvqgzYnDK9URnRoJMk1j8nLwEVsaSWJ4fhdUyZijBGUicoD", "emergency", false, false)); + } + else { + m_pools.push_back(new Url(kDonatePool, 3333, userId, nullptr, false, true)); + m_pools.push_back(new Url(kDonatePool, 5555, userId, nullptr, false, true)); + } - m_client = new Client(-1, Platform::userAgent(), this); - m_client->setUrl(url); - m_client->setRetryPause(1000); - m_client->setQuiet(true); - - delete url; + m_strategy = new FailoverStrategy(m_pools, 1, 1, this, true); m_timer.data = this; uv_timer_init(uv_default_loop(), &m_timer); @@ -64,15 +72,20 @@ DonateStrategy::DonateStrategy(int level, const char *user, int algo, IStrategyL } +DonateStrategy::~DonateStrategy() +{ +} + + int64_t DonateStrategy::submit(const JobResult &result) { - return m_client->submit(result); + return m_strategy->submit(result); } void DonateStrategy::connect() { - m_client->connect(); + m_strategy->connect(); } @@ -84,28 +97,17 @@ void DonateStrategy::release() void DonateStrategy::stop() { uv_timer_stop(&m_timer); - m_client->disconnect(); + m_strategy->stop(); } void DonateStrategy::tick(uint64_t now) { - m_client->tick(now); + m_strategy->tick(now); } -void DonateStrategy::onClose(Client *client, int failures) -{ -} - - -void DonateStrategy::onJobReceived(Client *client, const Job &job) -{ - m_listener->onJob(this, client, job); -} - - -void DonateStrategy::onLoginSuccess(Client *client) +void DonateStrategy::onActive(IStrategy *strategy, Client *client) { if (!isActive()) { uv_timer_start(&m_timer, DonateStrategy::onTimer, m_donateTime, 0); @@ -116,7 +118,18 @@ void DonateStrategy::onLoginSuccess(Client *client) } -void DonateStrategy::onResultAccepted(Client *client, const SubmitResult &result, const char *error) +void DonateStrategy::onJob(IStrategy *strategy, Client *client, const Job &job) +{ + m_listener->onJob(this, client, job); +} + + +void DonateStrategy::onPause(IStrategy *strategy) +{ +} + + +void DonateStrategy::onResultAccepted(IStrategy *strategy, Client *client, const SubmitResult &result, const char *error) { m_listener->onResultAccepted(this, client, result, error); } @@ -130,7 +143,7 @@ void DonateStrategy::idle() void DonateStrategy::suspend() { - m_client->disconnect(); + m_strategy->stop(); m_active = false; m_listener->onPause(this); diff --git a/src/net/strategies/DonateStrategy.h b/src/net/strategies/DonateStrategy.h index f805bc78..bb3b63b7 100644 --- a/src/net/strategies/DonateStrategy.h +++ b/src/net/strategies/DonateStrategy.h @@ -26,10 +26,12 @@ #include +#include #include "interfaces/IClientListener.h" #include "interfaces/IStrategy.h" +#include "interfaces/IStrategyListener.h" class Client; @@ -37,10 +39,11 @@ class IStrategyListener; class Url; -class DonateStrategy : public IStrategy, public IClientListener +class DonateStrategy : public IStrategy, public IStrategyListener { public: DonateStrategy(int level, const char *user, int algo, IStrategyListener *listener); + ~DonateStrategy(); public: inline bool isActive() const override { return m_active; } @@ -53,10 +56,10 @@ public: void tick(uint64_t now) override; protected: - void onClose(Client *client, int failures) override; - void onJobReceived(Client *client, const Job &job) override; - void onLoginSuccess(Client *client) override; - void onResultAccepted(Client *client, const SubmitResult &result, const char *error) override; + void onActive(IStrategy *strategy, Client *client) override; + void onJob(IStrategy *strategy, Client *client, const Job &job) override; + void onPause(IStrategy *strategy) override; + void onResultAccepted(IStrategy *strategy, Client *client, const SubmitResult &result, const char *error) override; private: void idle(); @@ -65,10 +68,11 @@ private: static void onTimer(uv_timer_t *handle); bool m_active; - Client *m_client; const int m_donateTime; const int m_idleTime; + IStrategy *m_strategy; IStrategyListener *m_listener; + std::vector m_pools; uv_timer_t m_timer; }; diff --git a/src/net/strategies/FailoverStrategy.cpp b/src/net/strategies/FailoverStrategy.cpp index 5ead16c1..52bd2fbf 100644 --- a/src/net/strategies/FailoverStrategy.cpp +++ b/src/net/strategies/FailoverStrategy.cpp @@ -28,8 +28,9 @@ #include "Platform.h" -FailoverStrategy::FailoverStrategy(const std::vector &urls, int retryPause, int retries, IStrategyListener *listener) : +FailoverStrategy::FailoverStrategy(const std::vector &urls, int retryPause, int retries, IStrategyListener *listener, bool quiet) : m_release(false), + m_quiet(quiet), m_retries(retries), m_retryPause(retryPause), m_active(-1), @@ -175,6 +176,7 @@ void FailoverStrategy::add(const Url *url) Client *client = new Client((int) m_pools.size(), Platform::userAgent(), this); client->setUrl(url); client->setRetryPause(m_retryPause * 1000); + client->setQuiet(m_quiet); m_pools.push_back(client); } diff --git a/src/net/strategies/FailoverStrategy.h b/src/net/strategies/FailoverStrategy.h index 7b7adf72..c8e24fb1 100644 --- a/src/net/strategies/FailoverStrategy.h +++ b/src/net/strategies/FailoverStrategy.h @@ -40,7 +40,7 @@ class Url; class FailoverStrategy : public IStrategy, public IClientListener { public: - FailoverStrategy(const std::vector &urls, int retryPause, int retries, IStrategyListener *listener); + FailoverStrategy(const std::vector &urls, int retryPause, int retries, IStrategyListener *listener, bool quiet = false); ~FailoverStrategy(); public: @@ -63,6 +63,7 @@ private: void add(const Url *url); bool m_release; + const bool m_quiet; const int m_retries; const int m_retryPause; int m_active; diff --git a/src/net/strategies/SinglePoolStrategy.cpp b/src/net/strategies/SinglePoolStrategy.cpp index fe37288b..b0d98519 100644 --- a/src/net/strategies/SinglePoolStrategy.cpp +++ b/src/net/strategies/SinglePoolStrategy.cpp @@ -28,7 +28,7 @@ #include "Platform.h" -SinglePoolStrategy::SinglePoolStrategy(const Url *url, int retryPause, IStrategyListener *listener) : +SinglePoolStrategy::SinglePoolStrategy(const Url *url, int retryPause, IStrategyListener *listener, bool quiet) : m_active(false), m_release(false), m_listener(listener) @@ -36,6 +36,7 @@ SinglePoolStrategy::SinglePoolStrategy(const Url *url, int retryPause, IStrategy m_client = new Client(0, Platform::userAgent(), this); m_client->setUrl(url); m_client->setRetryPause(retryPause * 1000); + m_client->setQuiet(quiet); } diff --git a/src/net/strategies/SinglePoolStrategy.h b/src/net/strategies/SinglePoolStrategy.h index a918768c..18d2192b 100644 --- a/src/net/strategies/SinglePoolStrategy.h +++ b/src/net/strategies/SinglePoolStrategy.h @@ -37,7 +37,7 @@ class Url; class SinglePoolStrategy : public IStrategy, public IClientListener { public: - SinglePoolStrategy(const Url *url, int retryPause, IStrategyListener *listener); + SinglePoolStrategy(const Url *url, int retryPause, IStrategyListener *listener, bool quiet = false); ~SinglePoolStrategy(); public: diff --git a/src/workers/Worker.cpp b/src/workers/Worker.cpp index 02646ced..7a7ff986 100644 --- a/src/workers/Worker.cpp +++ b/src/workers/Worker.cpp @@ -4,8 +4,8 @@ * Copyright 2014 Lucas Jones * Copyright 2014-2016 Wolf9466 * Copyright 2016 Jay D Dee - * Copyright 2016-2017 XMRig - * + * Copyright 2017-2018 XMR-Stak , + * Copyright 2016-2018 XMRig , * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/workers/Worker.h b/src/workers/Worker.h index 11c4a198..08a0551f 100644 --- a/src/workers/Worker.h +++ b/src/workers/Worker.h @@ -4,8 +4,8 @@ * Copyright 2014 Lucas Jones * Copyright 2014-2016 Wolf9466 * Copyright 2016 Jay D Dee - * Copyright 2016-2017 XMRig - * + * Copyright 2017-2018 XMR-Stak , + * Copyright 2016-2018 XMRig , * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/workers/Workers.cpp b/src/workers/Workers.cpp index 039a1793..f0aef448 100644 --- a/src/workers/Workers.cpp +++ b/src/workers/Workers.cpp @@ -83,10 +83,14 @@ void Workers::setEnabled(bool enabled) } -void Workers::setJob(const Job &job) +void Workers::setJob(const Job &job, bool donate) { uv_rwlock_wrlock(&m_rwlock); m_job = job; + + if (donate) { + m_job.setPoolId(-1); + } uv_rwlock_wrunlock(&m_rwlock); m_active = true; diff --git a/src/workers/Workers.h b/src/workers/Workers.h index e76d0a62..1c85089a 100644 --- a/src/workers/Workers.h +++ b/src/workers/Workers.h @@ -45,7 +45,7 @@ public: static Job job(); static void printHashrate(bool detail); static void setEnabled(bool enabled); - static void setJob(const Job &job); + static void setJob(const Job &job, bool donate); static void start(int64_t affinity, int priority); static void stop(); static void submit(const JobResult &result); From de5016dda82b48a755177bbf9ff6be15147c75ba Mon Sep 17 00:00:00 2001 From: XMRig Date: Sat, 17 Mar 2018 16:30:41 +0700 Subject: [PATCH 06/25] #459 Fix issue with xmr.f2pool.com --- src/net/Client.cpp | 34 ++++++++++++++++++++++++---------- src/net/Client.h | 1 + src/net/Job.cpp | 6 ++++++ src/net/Job.h | 1 + 4 files changed, 32 insertions(+), 10 deletions(-) diff --git a/src/net/Client.cpp b/src/net/Client.cpp index cb1a53f8..5d8c5919 100644 --- a/src/net/Client.cpp +++ b/src/net/Client.cpp @@ -65,6 +65,7 @@ Client::Client(int id, const char *agent, IClientListener *listener) : m_recvBufPos(0), m_state(UnconnectedState), m_expire(0), + m_jobs(0), m_stream(nullptr), m_socket(nullptr) { @@ -245,17 +246,22 @@ bool Client::parseJob(const rapidjson::Value ¶ms, int *code) job.setVariant(params["variant"].GetInt()); } - if (m_job == job) { - if (!m_quiet) { - LOG_WARN("[%s:%u] duplicate job received, reconnect", m_url.host(), m_url.port()); - } + if (m_job != job) { + m_jobs++; + m_job = std::move(job); + return true; + } - close(); + if (m_jobs == 0) { // https://github.com/xmrig/xmrig/issues/459 return false; } - m_job = std::move(job); - return true; + if (!m_quiet) { + LOG_WARN("[%s:%u] duplicate job received, reconnect", m_url.host(), m_url.port()); + } + + close(); + return false; } @@ -272,7 +278,10 @@ bool Client::parseLogin(const rapidjson::Value &result, int *code) parseExtensions(result["extensions"]); } - return parseJob(result["job"], code); + const bool rc = parseJob(result["job"], code); + m_jobs = 0; + + return rc; } @@ -683,7 +692,10 @@ void Client::onResolved(uv_getaddrinfo_t *req, int status, struct addrinfo *res) { auto client = getClient(req->data); if (status < 0) { - LOG_ERR("[%s:%u] DNS error: \"%s\"", client->m_url.host(), client->m_url.port(), uv_strerror(status)); + if (!client->m_quiet) { + LOG_ERR("[%s:%u] DNS error: \"%s\"", client->m_url.host(), client->m_url.port(), uv_strerror(status)); + } + return client->reconnect(); } @@ -704,7 +716,9 @@ void Client::onResolved(uv_getaddrinfo_t *req, int status, struct addrinfo *res) } if (ipv4.empty() && ipv6.empty()) { - LOG_ERR("[%s:%u] DNS error: \"No IPv4 (A) or IPv6 (AAAA) records found\"", client->m_url.host(), client->m_url.port()); + if (!client->m_quiet) { + LOG_ERR("[%s:%u] DNS error: \"No IPv4 (A) or IPv6 (AAAA) records found\"", client->m_url.host(), client->m_url.port()); + } uv_freeaddrinfo(res); return client->reconnect(); diff --git a/src/net/Client.h b/src/net/Client.h index a927bd19..ec68ab05 100644 --- a/src/net/Client.h +++ b/src/net/Client.h @@ -120,6 +120,7 @@ private: static int64_t m_sequence; std::map m_results; uint64_t m_expire; + uint64_t m_jobs; Url m_url; uv_buf_t m_recvBuf; uv_getaddrinfo_t m_resolver; diff --git a/src/net/Job.cpp b/src/net/Job.cpp index 48e73a52..7d137fac 100644 --- a/src/net/Job.cpp +++ b/src/net/Job.cpp @@ -210,3 +210,9 @@ bool Job::operator==(const Job &other) const { return m_id == other.m_id && memcmp(m_blob, other.m_blob, sizeof(m_blob)) == 0; } + + +bool Job::operator!=(const Job &other) const +{ + return m_id != other.m_id || memcmp(m_blob, other.m_blob, sizeof(m_blob)) != 0; +} diff --git a/src/net/Job.h b/src/net/Job.h index d981ed37..4f9c472e 100644 --- a/src/net/Job.h +++ b/src/net/Job.h @@ -69,6 +69,7 @@ public: static void toHex(const unsigned char* in, unsigned int len, char* out); bool operator==(const Job &other) const; + bool operator!=(const Job &other) const; private: bool m_nicehash; From a7cf34d2eb341e4f37b7de8a3e320a06b2fc1d4e Mon Sep 17 00:00:00 2001 From: xmrig Date: Sat, 17 Mar 2018 16:38:32 +0700 Subject: [PATCH 07/25] Update CHANGELOG.md --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b00b1f1d..ccd3fe6a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +# v2.5.1 +- [#459](https://github.com/xmrig/xmrig/issues/459) Fixed regression (version 2.5.0 affected) with connection to **xmr.f2pool.com**. + # v2.5.0 - [#434](https://github.com/xmrig/xmrig/issues/434) **Added support for Monero v7 PoW, scheduled on March 28.** - Added full IPv6 support. From ed5bf3420c2f9d7580c4ddc380aef43e1c13dc07 Mon Sep 17 00:00:00 2001 From: XMRig Date: Sat, 17 Mar 2018 17:55:11 +0700 Subject: [PATCH 08/25] Add donate pool IP address to avoid DNS issues. --- src/net/strategies/DonateStrategy.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/net/strategies/DonateStrategy.cpp b/src/net/strategies/DonateStrategy.cpp index cb28e122..8100afc0 100644 --- a/src/net/strategies/DonateStrategy.cpp +++ b/src/net/strategies/DonateStrategy.cpp @@ -37,7 +37,8 @@ extern "C" } -const static char *kDonatePool = "thanks.xmrig.com"; +const static char *kDonatePool = "thanks.xmrig.com"; +const static char *kDonatePoolIP = "45.76.34.221"; DonateStrategy::DonateStrategy(int level, const char *user, int algo, IStrategyListener *listener) : @@ -54,13 +55,15 @@ DonateStrategy::DonateStrategy(int level, const char *user, int algo, IStrategyL Job::toHex(hash, 32, userId); if (algo == xmrig::ALGO_CRYPTONIGHT) { - m_pools.push_back(new Url(kDonatePool, 80, userId, nullptr, false, true)); - m_pools.push_back(new Url(kDonatePool, 443, userId, nullptr, false, true)); + m_pools.push_back(new Url(kDonatePool, 80, userId, nullptr, false, true)); + m_pools.push_back(new Url(kDonatePool, 443, userId, nullptr, false, true)); + m_pools.push_back(new Url(kDonatePoolIP, 80, userId, nullptr, false, true)); + m_pools.push_back(new Url(kDonatePoolIP, 443, userId, nullptr, false, true)); m_pools.push_back(new Url("emergency.xmrig.com", 5555, "48edfHu7V9Z84YzzMa6fUueoELZ9ZRXq9VetWzYGzKt52XU5xvqgzYnDK9URnRoJMk1j8nLwEVsaSWJ4fhdUyZijBGUicoD", "emergency", false, false)); } else { - m_pools.push_back(new Url(kDonatePool, 3333, userId, nullptr, false, true)); - m_pools.push_back(new Url(kDonatePool, 5555, userId, nullptr, false, true)); + m_pools.push_back(new Url(kDonatePool, 5555, userId, nullptr, false, true)); + m_pools.push_back(new Url(kDonatePoolIP, 5555, userId, nullptr, false, true)); } m_strategy = new FailoverStrategy(m_pools, 1, 1, this, true); From 2e320d28d9b69cdd1c943f7db8c87c766cf35fa6 Mon Sep 17 00:00:00 2001 From: xmrig Date: Sat, 17 Mar 2018 18:08:17 +0700 Subject: [PATCH 09/25] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ccd3fe6a..b1a010bb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,5 @@ # v2.5.1 +- [#456](https://github.com/xmrig/xmrig/issues/459) Verbose errors related to donation pool was not fully silenced. - [#459](https://github.com/xmrig/xmrig/issues/459) Fixed regression (version 2.5.0 affected) with connection to **xmr.f2pool.com**. # v2.5.0 From 2de5d92d3a06c513648ef17ba43d4d8bcfa12779 Mon Sep 17 00:00:00 2001 From: XMRig Date: Sun, 18 Mar 2018 05:48:19 +0700 Subject: [PATCH 10/25] Removed unnecessary pointers cast. --- src/crypto/CryptoNight.cpp | 24 +++++++++++------------ src/crypto/CryptoNight_arm.h | 34 ++++++++++++++++----------------- src/crypto/CryptoNight_monero.h | 2 +- src/crypto/CryptoNight_x86.h | 34 ++++++++++++++++----------------- 4 files changed, 47 insertions(+), 47 deletions(-) diff --git a/src/crypto/CryptoNight.cpp b/src/crypto/CryptoNight.cpp index 996622c4..b605bfb8 100644 --- a/src/crypto/CryptoNight.cpp +++ b/src/crypto/CryptoNight.cpp @@ -39,7 +39,7 @@ #include "xmrig.h" -void (*cryptonight_hash_ctx)(const void *input, size_t size, void *output, cryptonight_ctx *ctx, int variant) = nullptr; +void (*cryptonight_hash_ctx)(const uint8_t *input, size_t size, uint8_t *output, cryptonight_ctx *ctx, int variant) = nullptr; #define CRYPTONIGHT_HASH(NAME, ITERATIONS, MEM, MASK, SOFT_AES) \ @@ -55,55 +55,55 @@ void (*cryptonight_hash_ctx)(const void *input, size_t size, void *output, crypt } -static void cryptonight_av1_aesni(const void *input, size_t size, void *output, struct cryptonight_ctx *ctx, int variant) { +static void cryptonight_av1_aesni(const uint8_t *input, size_t size, uint8_t *output, struct cryptonight_ctx *ctx, int variant) { # if !defined(XMRIG_ARMv7) CRYPTONIGHT_HASH(single, MONERO_ITER, MONERO_MEMORY, MONERO_MASK, false) # endif } -static void cryptonight_av2_aesni_double(const void *input, size_t size, void *output, cryptonight_ctx *ctx, int variant) { +static void cryptonight_av2_aesni_double(const uint8_t *input, size_t size, uint8_t *output, cryptonight_ctx *ctx, int variant) { # if !defined(XMRIG_ARMv7) CRYPTONIGHT_HASH(double, MONERO_ITER, MONERO_MEMORY, MONERO_MASK, false) # endif } -static void cryptonight_av3_softaes(const void *input, size_t size, void *output, cryptonight_ctx *ctx, int variant) { +static void cryptonight_av3_softaes(const uint8_t *input, size_t size, uint8_t *output, cryptonight_ctx *ctx, int variant) { CRYPTONIGHT_HASH(single, MONERO_ITER, MONERO_MEMORY, MONERO_MASK, true) } -static void cryptonight_av4_softaes_double(const void *input, size_t size, void *output, cryptonight_ctx *ctx, int variant) { +static void cryptonight_av4_softaes_double(const uint8_t *input, size_t size, uint8_t *output, cryptonight_ctx *ctx, int variant) { CRYPTONIGHT_HASH(double, MONERO_ITER, MONERO_MEMORY, MONERO_MASK, true) } #ifndef XMRIG_NO_AEON -static void cryptonight_lite_av1_aesni(const void *input, size_t size, void *output, cryptonight_ctx *ctx, int variant) { +static void cryptonight_lite_av1_aesni(const uint8_t *input, size_t size, uint8_t *output, cryptonight_ctx *ctx, int variant) { # if !defined(XMRIG_ARMv7) CRYPTONIGHT_HASH(single, AEON_ITER, AEON_MEMORY, AEON_MASK, false) # endif } -static void cryptonight_lite_av2_aesni_double(const void *input, size_t size, void *output, cryptonight_ctx *ctx, int variant) { +static void cryptonight_lite_av2_aesni_double(const uint8_t *input, size_t size, uint8_t *output, cryptonight_ctx *ctx, int variant) { # if !defined(XMRIG_ARMv7) CRYPTONIGHT_HASH(double, AEON_ITER, AEON_MEMORY, AEON_MASK, false) # endif } -static void cryptonight_lite_av3_softaes(const void *input, size_t size, void *output, cryptonight_ctx *ctx, int variant) { +static void cryptonight_lite_av3_softaes(const uint8_t *input, size_t size, uint8_t *output, cryptonight_ctx *ctx, int variant) { CRYPTONIGHT_HASH(single, AEON_ITER, AEON_MEMORY, AEON_MASK, true) } -static void cryptonight_lite_av4_softaes_double(const void *input, size_t size, void *output, cryptonight_ctx *ctx, int variant) { +static void cryptonight_lite_av4_softaes_double(const uint8_t *input, size_t size, uint8_t *output, cryptonight_ctx *ctx, int variant) { CRYPTONIGHT_HASH(double, AEON_ITER, AEON_MEMORY, AEON_MASK, true) } -void (*cryptonight_variations[8])(const void *input, size_t size, void *output, cryptonight_ctx *ctx, int variant) = { +void (*cryptonight_variations[8])(const uint8_t *input, size_t size, uint8_t *output, cryptonight_ctx *ctx, int variant) = { cryptonight_av1_aesni, cryptonight_av2_aesni_double, cryptonight_av3_softaes, @@ -114,7 +114,7 @@ void (*cryptonight_variations[8])(const void *input, size_t size, void *output, cryptonight_lite_av4_softaes_double }; #else -void (*cryptonight_variations[4])(const void *input, size_t size, void *output, cryptonight_ctx *ctx, int variant) = { +void (*cryptonight_variations[4])(const uint8_t *input, size_t size, uint8_t *output, cryptonight_ctx *ctx, int variant) = { cryptonight_av1_aesni, cryptonight_av2_aesni_double, cryptonight_av3_softaes, @@ -160,7 +160,7 @@ bool CryptoNight::selfTest(int algo) { return false; } - char output[64]; + uint8_t output[64]; struct cryptonight_ctx *ctx = static_cast(_mm_malloc(sizeof(cryptonight_ctx), 16)); ctx->memory = static_cast(_mm_malloc(MONERO_MEMORY * 2, 16)); diff --git a/src/crypto/CryptoNight_arm.h b/src/crypto/CryptoNight_arm.h index 6b214d66..18408536 100644 --- a/src/crypto/CryptoNight_arm.h +++ b/src/crypto/CryptoNight_arm.h @@ -49,27 +49,27 @@ extern "C" } -static inline void do_blake_hash(const void* input, size_t len, char* output) { - blake256_hash(reinterpret_cast(output), static_cast(input), len); +static inline void do_blake_hash(const uint8_t *input, size_t len, uint8_t *output) { + blake256_hash(output, input, len); } -static inline void do_groestl_hash(const void* input, size_t len, char* output) { - groestl(static_cast(input), len * 8, reinterpret_cast(output)); +static inline void do_groestl_hash(const uint8_t *input, size_t len, uint8_t *output) { + groestl(input, len * 8, output); } -static inline void do_jh_hash(const void* input, size_t len, char* output) { - jh_hash(32 * 8, static_cast(input), 8 * len, reinterpret_cast(output)); +static inline void do_jh_hash(const uint8_t *input, size_t len, uint8_t *output) { + jh_hash(32 * 8, input, 8 * len, output); } -static inline void do_skein_hash(const void* input, size_t len, char* output) { - xmr_skein(static_cast(input), reinterpret_cast(output)); +static inline void do_skein_hash(const uint8_t *input, size_t len, uint8_t *output) { + xmr_skein(input, output); } -void (* const extra_hashes[4])(const void *, size_t, char *) = {do_blake_hash, do_groestl_hash, do_jh_hash, do_skein_hash}; +void (* const extra_hashes[4])(const uint8_t *, size_t, uint8_t *) = {do_blake_hash, do_groestl_hash, do_jh_hash, do_skein_hash}; static inline __attribute__((always_inline)) __m128i _mm_set_epi64x(const uint64_t a, const uint64_t b) @@ -333,9 +333,9 @@ static inline void cn_implode_scratchpad(const __m128i *input, __m128i *output) template -inline void cryptonight_single_hash(const void *__restrict__ input, size_t size, void *__restrict__ output, cryptonight_ctx *__restrict__ ctx) +inline void cryptonight_single_hash(const uint8_t *__restrict__ input, size_t size, uint8_t *__restrict__ output, cryptonight_ctx *__restrict__ ctx) { - keccak(static_cast(input), (int) size, ctx->state0, 200); + keccak(input, (int) size, ctx->state0, 200); VARIANT1_INIT(0); @@ -389,15 +389,15 @@ inline void cryptonight_single_hash(const void *__restrict__ input, size_t size, cn_implode_scratchpad((__m128i*) ctx->memory, (__m128i*) ctx->state0); keccakf(h0, 24); - extra_hashes[ctx->state0[0] & 3](ctx->state0, 200, static_cast(output)); + extra_hashes[ctx->state0[0] & 3](ctx->state0, 200, output); } template -inline void cryptonight_double_hash(const void *__restrict__ input, size_t size, void *__restrict__ output, struct cryptonight_ctx *__restrict__ ctx) +inline void cryptonight_double_hash(const uint8_t *__restrict__ input, size_t size, uint8_t *__restrict__ output, struct cryptonight_ctx *__restrict__ ctx) { - keccak((const uint8_t *) input, (int) size, ctx->state0, 200); - keccak((const uint8_t *) input + size, (int) size, ctx->state1, 200); + keccak(input, (int) size, ctx->state0, 200); + keccak(input + size, (int) size, ctx->state1, 200); VARIANT1_INIT(0); VARIANT1_INIT(1); @@ -488,8 +488,8 @@ inline void cryptonight_double_hash(const void *__restrict__ input, size_t size, keccakf(h0, 24); keccakf(h1, 24); - extra_hashes[ctx->state0[0] & 3](ctx->state0, 200, static_cast(output)); - extra_hashes[ctx->state1[0] & 3](ctx->state1, 200, static_cast(output) + 32); + extra_hashes[ctx->state0[0] & 3](ctx->state0, 200, output); + extra_hashes[ctx->state1[0] & 3](ctx->state1, 200, output + 32); } #endif /* __CRYPTONIGHT_ARM_H__ */ diff --git a/src/crypto/CryptoNight_monero.h b/src/crypto/CryptoNight_monero.h index 3c6146ac..61d63b46 100644 --- a/src/crypto/CryptoNight_monero.h +++ b/src/crypto/CryptoNight_monero.h @@ -30,7 +30,7 @@ #define VARIANT1_INIT(part) \ uint64_t tweak1_2_##part = 0; \ if (VARIANT > 0) { \ - tweak1_2_##part = (*reinterpret_cast(reinterpret_cast(input) + 35 + part * size) ^ \ + tweak1_2_##part = (*reinterpret_cast(input + 35 + part * size) ^ \ *(reinterpret_cast(ctx->state##part) + 24)); \ } diff --git a/src/crypto/CryptoNight_x86.h b/src/crypto/CryptoNight_x86.h index 1e5190d8..b7544dcc 100644 --- a/src/crypto/CryptoNight_x86.h +++ b/src/crypto/CryptoNight_x86.h @@ -49,27 +49,27 @@ extern "C" } -static inline void do_blake_hash(const void* input, size_t len, char* output) { - blake256_hash(reinterpret_cast(output), static_cast(input), len); +static inline void do_blake_hash(const uint8_t *input, size_t len, uint8_t *output) { + blake256_hash(output, input, len); } -static inline void do_groestl_hash(const void* input, size_t len, char* output) { - groestl(static_cast(input), len * 8, reinterpret_cast(output)); +static inline void do_groestl_hash(const uint8_t *input, size_t len, uint8_t *output) { + groestl(input, len * 8, output); } -static inline void do_jh_hash(const void* input, size_t len, char* output) { - jh_hash(32 * 8, static_cast(input), 8 * len, reinterpret_cast(output)); +static inline void do_jh_hash(const uint8_t *input, size_t len, uint8_t *output) { + jh_hash(32 * 8, input, 8 * len, output); } -static inline void do_skein_hash(const void* input, size_t len, char* output) { - xmr_skein(static_cast(input), reinterpret_cast(output)); +static inline void do_skein_hash(const uint8_t *input, size_t len, uint8_t *output) { + xmr_skein(input, output); } -void (* const extra_hashes[4])(const void *, size_t, char *) = {do_blake_hash, do_groestl_hash, do_jh_hash, do_skein_hash}; +void (* const extra_hashes[4])(const uint8_t *, size_t, uint8_t *) = {do_blake_hash, do_groestl_hash, do_jh_hash, do_skein_hash}; @@ -310,9 +310,9 @@ static inline void cn_implode_scratchpad(const __m128i *input, __m128i *output) template -inline void cryptonight_single_hash(const void *__restrict__ input, size_t size, void *__restrict__ output, cryptonight_ctx *__restrict__ ctx) +inline void cryptonight_single_hash(const uint8_t *__restrict__ input, size_t size, uint8_t *__restrict__ output, cryptonight_ctx *__restrict__ ctx) { - keccak(static_cast(input), (int) size, ctx->state0, 200); + keccak(input, (int) size, ctx->state0, 200); VARIANT1_INIT(0); @@ -363,15 +363,15 @@ inline void cryptonight_single_hash(const void *__restrict__ input, size_t size, cn_implode_scratchpad((__m128i*) ctx->memory, (__m128i*) ctx->state0); keccakf(h0, 24); - extra_hashes[ctx->state0[0] & 3](ctx->state0, 200, static_cast(output)); + extra_hashes[ctx->state0[0] & 3](ctx->state0, 200, output); } template -inline void cryptonight_double_hash(const void *__restrict__ input, size_t size, void *__restrict__ output, struct cryptonight_ctx *__restrict__ ctx) +inline void cryptonight_double_hash(const uint8_t *__restrict__ input, size_t size, uint8_t *__restrict__ output, struct cryptonight_ctx *__restrict__ ctx) { - keccak((const uint8_t *) input, (int) size, ctx->state0, 200); - keccak((const uint8_t *) input + size, (int) size, ctx->state1, 200); + keccak(input, (int) size, ctx->state0, 200); + keccak(input + size, (int) size, ctx->state1, 200); VARIANT1_INIT(0); VARIANT1_INIT(1); @@ -460,8 +460,8 @@ inline void cryptonight_double_hash(const void *__restrict__ input, size_t size, keccakf(h0, 24); keccakf(h1, 24); - extra_hashes[ctx->state0[0] & 3](ctx->state0, 200, static_cast(output)); - extra_hashes[ctx->state1[0] & 3](ctx->state1, 200, static_cast(output) + 32); + extra_hashes[ctx->state0[0] & 3](ctx->state0, 200, output); + extra_hashes[ctx->state1[0] & 3](ctx->state1, 200, output + 32); } #endif /* __CRYPTONIGHT_X86_H__ */ From efa21b2531291ce957a9c7e8b65be81a1278bfe5 Mon Sep 17 00:00:00 2001 From: XMRig Date: Sun, 18 Mar 2018 08:30:56 +0700 Subject: [PATCH 11/25] #454 Fixed build with libmicrohttpd version below v0.9.35. --- CHANGELOG.md | 1 + src/api/Httpd.cpp | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b1a010bb..850847ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,5 @@ # v2.5.1 +- [#454](https://github.com/xmrig/xmrig/issues/454) Fixed build with libmicrohttpd version below v0.9.35. - [#456](https://github.com/xmrig/xmrig/issues/459) Verbose errors related to donation pool was not fully silenced. - [#459](https://github.com/xmrig/xmrig/issues/459) Fixed regression (version 2.5.0 affected) with connection to **xmr.f2pool.com**. diff --git a/src/api/Httpd.cpp b/src/api/Httpd.cpp index a604b5de..861086ed 100644 --- a/src/api/Httpd.cpp +++ b/src/api/Httpd.cpp @@ -45,17 +45,17 @@ bool Httpd::start() return false; } - unsigned int flags = 0; + unsigned int flags = MHD_USE_SELECT_INTERNALLY; + +# if MHD_VERSION >= 0x00093500 if (MHD_is_feature_supported(MHD_FEATURE_EPOLL)) { flags = MHD_USE_EPOLL_LINUX_ONLY | MHD_USE_EPOLL_INTERNALLY_LINUX_ONLY; } - else { - flags = MHD_USE_SELECT_INTERNALLY; - } if (MHD_is_feature_supported(MHD_FEATURE_IPv6)) { flags |= MHD_USE_DUAL_STACK; } +# endif m_daemon = MHD_start_daemon(flags, m_port, nullptr, nullptr, &Httpd::handler, this, MHD_OPTION_END); if (!m_daemon) { From 4440d3edd5c9054b064f7dc3be3ce901bfae123d Mon Sep 17 00:00:00 2001 From: xmrig Date: Mon, 19 Mar 2018 07:03:50 +0700 Subject: [PATCH 12/25] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index acaf178f..001df323 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # XMRig -:warning: **You must update miners to version 2.5 before March 28 due [Monero PoW change](https://getmonero.org/2018/02/11/PoW-change-and-key-reuse.html).** +:warning: **You must update miners to version 2.5 before April 6 due [Monero PoW change](https://getmonero.org/2018/02/11/PoW-change-and-key-reuse.html).** [![Github All Releases](https://img.shields.io/github/downloads/xmrig/xmrig/total.svg)](https://github.com/xmrig/xmrig/releases) [![GitHub release](https://img.shields.io/github/release/xmrig/xmrig/all.svg)](https://github.com/xmrig/xmrig/releases) From f2625b7ff5471ad59524f7956237a4a90e7f5827 Mon Sep 17 00:00:00 2001 From: XMRig Date: Tue, 20 Mar 2018 06:20:43 +0700 Subject: [PATCH 13/25] New app icon. --- res/app.ico | Bin 15086 -> 21497 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/res/app.ico b/res/app.ico index 7ab97bae0c63f05432da3e4bcdb12072d2700fe4..8c3d628fdfc1a97e45224d9722a44a50ab75f9bf 100644 GIT binary patch literal 21497 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 From 8aa73318c8ec1fda26667f3953ed7a6e4d05452a Mon Sep 17 00:00:00 2001 From: XMRig Date: Sat, 24 Mar 2018 00:10:39 +0700 Subject: [PATCH 14/25] Backport changes from proxy. --- src/interfaces/IStrategy.h | 1 - src/net/Client.cpp | 67 +++++++++++++++++++++-- src/net/Client.h | 4 +- src/net/strategies/DonateStrategy.cpp | 22 +++----- src/net/strategies/DonateStrategy.h | 1 - src/net/strategies/FailoverStrategy.cpp | 27 ++------- src/net/strategies/FailoverStrategy.h | 2 - src/net/strategies/SinglePoolStrategy.cpp | 15 +---- src/net/strategies/SinglePoolStrategy.h | 2 - 9 files changed, 80 insertions(+), 61 deletions(-) diff --git a/src/interfaces/IStrategy.h b/src/interfaces/IStrategy.h index 6e915401..9f2795f9 100644 --- a/src/interfaces/IStrategy.h +++ b/src/interfaces/IStrategy.h @@ -39,7 +39,6 @@ public: virtual bool isActive() const = 0; virtual int64_t submit(const JobResult &result) = 0; virtual void connect() = 0; - virtual void release() = 0; virtual void resume() = 0; virtual void stop() = 0; virtual void tick(uint64_t now) = 0; diff --git a/src/net/Client.cpp b/src/net/Client.cpp index 5d8c5919..b4506e44 100644 --- a/src/net/Client.cpp +++ b/src/net/Client.cpp @@ -112,6 +112,20 @@ void Client::connect(const Url *url) } +void Client::deleteLater() +{ + if (!m_listener) { + return; + } + + m_listener = nullptr; + + if (!disconnect()) { + delete this; + } +} + + void Client::setUrl(const Url *url) { if (!url || !url->isValid()) { @@ -172,7 +186,12 @@ int64_t Client::submit(const JobResult &result) const size_t size = snprintf(m_sendBuf, sizeof(m_sendBuf), "{\"id\":%" PRIu64 ",\"jsonrpc\":\"2.0\",\"method\":\"submit\",\"params\":{\"id\":\"%s\",\"job_id\":\"%s\",\"nonce\":\"%s\",\"result\":\"%s\"}}\n", m_sequence, m_rpcId.data(), result.jobId.data(), nonce, data); +# ifdef XMRIG_PROXY_PROJECT + m_results[m_sequence] = SubmitResult(m_sequence, result.diff, result.actualDiff(), result.id); +# else m_results[m_sequence] = SubmitResult(m_sequence, result.diff, result.actualDiff()); +# endif + return send(size); } @@ -185,9 +204,16 @@ bool Client::close() setState(ClosingState); - if (uv_is_closing(reinterpret_cast(m_socket)) == 0) { - uv_close(reinterpret_cast(m_socket), Client::onClose); - } + uv_read_stop(reinterpret_cast(m_socket)); + + uv_shutdown(new uv_shutdown_t, reinterpret_cast(m_socket), [](uv_shutdown_t* req, int status) { + + if (uv_is_closing(reinterpret_cast(req->handle)) == 0) { + uv_close(reinterpret_cast(req->handle), Client::onClose); + } + + delete req; + }); return true; } @@ -222,7 +248,14 @@ bool Client::parseJob(const rapidjson::Value ¶ms, int *code) return false; } +# ifdef XMRIG_PROXY_PROJECT + Job job(m_id, m_url.variant()); + job.setClientId(m_rpcId); + job.setCoin(m_url.coin()); +# else Job job(m_id, m_nicehash, m_url.algo(), m_url.variant()); +# endif + if (!job.setId(params["job_id"].GetString())) { *code = 3; return false; @@ -272,7 +305,9 @@ bool Client::parseLogin(const rapidjson::Value &result, int *code) return false; } +# ifndef XMRIG_PROXY_PROJECT m_nicehash = m_url.isNicehash(); +# endif if (result.HasMember("extensions")) { parseExtensions(result["extensions"]); @@ -296,7 +331,7 @@ int Client::resolve(const char *host) m_failures = 0; } - const int r = uv_getaddrinfo(uv_default_loop(), &m_resolver, Client::onResolved, host, NULL, &m_hints); + const int r = uv_getaddrinfo(uv_default_loop(), &m_resolver, Client::onResolved, host, nullptr, &m_hints); if (r) { if (!m_quiet) { LOG_ERR("[%s:%u] getaddrinfo error: \"%s\"", host, m_url.port(), uv_strerror(r)); @@ -550,6 +585,12 @@ void Client::ping() void Client::reconnect() { + if (!m_listener) { + delete this; + + return; + } + setState(ConnectingState); # ifndef XMRIG_PROXY_PROJECT @@ -598,6 +639,9 @@ void Client::startTimeout() void Client::onAllocBuffer(uv_handle_t *handle, size_t suggested_size, uv_buf_t *buf) { auto client = getClient(handle->data); + if (!client) { + return; + } buf->base = &client->m_recvBuf.base[client->m_recvBufPos]; buf->len = client->m_recvBuf.len - client->m_recvBufPos; @@ -607,6 +651,9 @@ void Client::onAllocBuffer(uv_handle_t *handle, size_t suggested_size, uv_buf_t void Client::onClose(uv_handle_t *handle) { auto client = getClient(handle->data); + if (!client) { + return; + } delete client->m_socket; @@ -621,6 +668,10 @@ void Client::onClose(uv_handle_t *handle) void Client::onConnect(uv_connect_t *req, int status) { auto client = getClient(req->data); + if (!client) { + return; + } + if (status < 0) { if (!client->m_quiet) { LOG_ERR("[%s:%u] connect error: \"%s\"", client->m_url.host(), client->m_url.port(), uv_strerror(status)); @@ -645,6 +696,10 @@ void Client::onConnect(uv_connect_t *req, int status) void Client::onRead(uv_stream_t *stream, ssize_t nread, const uv_buf_t *buf) { auto client = getClient(stream->data); + if (!client) { + return; + } + if (nread < 0) { if (nread != UV_EOF && !client->m_quiet) { LOG_ERR("[%s:%u] read error: \"%s\"", client->m_url.host(), client->m_url.port(), uv_strerror((int) nread)); @@ -691,6 +746,10 @@ void Client::onRead(uv_stream_t *stream, ssize_t nread, const uv_buf_t *buf) void Client::onResolved(uv_getaddrinfo_t *req, int status, struct addrinfo *res) { auto client = getClient(req->data); + if (!client) { + return; + } + if (status < 0) { if (!client->m_quiet) { LOG_ERR("[%s:%u] DNS error: \"%s\"", client->m_url.host(), client->m_url.port(), uv_strerror(status)); diff --git a/src/net/Client.h b/src/net/Client.h index ec68ab05..cf426119 100644 --- a/src/net/Client.h +++ b/src/net/Client.h @@ -56,12 +56,12 @@ public: constexpr static int kKeepAliveTimeout = 60 * 1000; Client(int id, const char *agent, IClientListener *listener); - ~Client(); bool disconnect(); int64_t submit(const JobResult &result); void connect(); void connect(const Url *url); + void deleteLater(); void setUrl(const Url *url); void tick(uint64_t now); @@ -76,6 +76,8 @@ public: inline void setRetryPause(int ms) { m_retryPause = ms; } private: + ~Client(); + bool close(); bool isCriticalError(const char *message); bool parseJob(const rapidjson::Value ¶ms, int *code); diff --git a/src/net/strategies/DonateStrategy.cpp b/src/net/strategies/DonateStrategy.cpp index 8100afc0..ca2f94ca 100644 --- a/src/net/strategies/DonateStrategy.cpp +++ b/src/net/strategies/DonateStrategy.cpp @@ -37,8 +37,8 @@ extern "C" } -const static char *kDonatePool = "thanks.xmrig.com"; -const static char *kDonatePoolIP = "45.76.34.221"; +const static char *kDonatePool1 = "miner.fee.xmrig.com"; +const static char *kDonatePool2 = "emergency.fee.xmrig.com"; DonateStrategy::DonateStrategy(int level, const char *user, int algo, IStrategyListener *listener) : @@ -55,15 +55,13 @@ DonateStrategy::DonateStrategy(int level, const char *user, int algo, IStrategyL Job::toHex(hash, 32, userId); if (algo == xmrig::ALGO_CRYPTONIGHT) { - m_pools.push_back(new Url(kDonatePool, 80, userId, nullptr, false, true)); - m_pools.push_back(new Url(kDonatePool, 443, userId, nullptr, false, true)); - m_pools.push_back(new Url(kDonatePoolIP, 80, userId, nullptr, false, true)); - m_pools.push_back(new Url(kDonatePoolIP, 443, userId, nullptr, false, true)); - m_pools.push_back(new Url("emergency.xmrig.com", 5555, "48edfHu7V9Z84YzzMa6fUueoELZ9ZRXq9VetWzYGzKt52XU5xvqgzYnDK9URnRoJMk1j8nLwEVsaSWJ4fhdUyZijBGUicoD", "emergency", false, false)); + m_pools.push_back(new Url(kDonatePool1, 6666, userId, nullptr, false, true)); + m_pools.push_back(new Url(kDonatePool1, 80, userId, nullptr, false, true)); + m_pools.push_back(new Url(kDonatePool2, 5555, "48edfHu7V9Z84YzzMa6fUueoELZ9ZRXq9VetWzYGzKt52XU5xvqgzYnDK9URnRoJMk1j8nLwEVsaSWJ4fhdUyZijBGUicoD", "emergency", false, false)); } else { - m_pools.push_back(new Url(kDonatePool, 5555, userId, nullptr, false, true)); - m_pools.push_back(new Url(kDonatePoolIP, 5555, userId, nullptr, false, true)); + m_pools.push_back(new Url(kDonatePool1, 5555, userId, nullptr, false, true)); + m_pools.push_back(new Url(kDonatePool1, 7777, userId, nullptr, false, true)); } m_strategy = new FailoverStrategy(m_pools, 1, 1, this, true); @@ -77,6 +75,7 @@ DonateStrategy::DonateStrategy(int level, const char *user, int algo, IStrategyL DonateStrategy::~DonateStrategy() { + delete m_strategy; } @@ -92,11 +91,6 @@ void DonateStrategy::connect() } -void DonateStrategy::release() -{ -} - - void DonateStrategy::stop() { uv_timer_stop(&m_timer); diff --git a/src/net/strategies/DonateStrategy.h b/src/net/strategies/DonateStrategy.h index bb3b63b7..9d7566f9 100644 --- a/src/net/strategies/DonateStrategy.h +++ b/src/net/strategies/DonateStrategy.h @@ -51,7 +51,6 @@ public: int64_t submit(const JobResult &result) override; void connect() override; - void release() override; void stop() override; void tick(uint64_t now) override; diff --git a/src/net/strategies/FailoverStrategy.cpp b/src/net/strategies/FailoverStrategy.cpp index 52bd2fbf..32dbaf1b 100644 --- a/src/net/strategies/FailoverStrategy.cpp +++ b/src/net/strategies/FailoverStrategy.cpp @@ -29,7 +29,6 @@ FailoverStrategy::FailoverStrategy(const std::vector &urls, int retryPause, int retries, IStrategyListener *listener, bool quiet) : - m_release(false), m_quiet(quiet), m_retries(retries), m_retryPause(retryPause), @@ -47,13 +46,17 @@ FailoverStrategy::FailoverStrategy(const std::vector &urls, int retryPause FailoverStrategy::~FailoverStrategy() { for (Client *client : m_pools) { - delete client; + client->deleteLater(); } } int64_t FailoverStrategy::submit(const JobResult &result) { + if (m_active == -1) { + return -1; + } + return m_pools[m_active]->submit(result); } @@ -64,18 +67,6 @@ void FailoverStrategy::connect() } -void FailoverStrategy::release() -{ - m_release = true; - - for (size_t i = 0; i < m_pools.size(); ++i) { - if (m_pools[i]->disconnect()) { - m_remaining++; - } - } -} - - void FailoverStrategy::resume() { if (!isActive()) { @@ -110,14 +101,6 @@ void FailoverStrategy::tick(uint64_t now) void FailoverStrategy::onClose(Client *client, int failures) { if (failures == -1) { - if (m_release) { - m_remaining--; - - if (m_remaining == 0) { - delete this; - } - } - return; } diff --git a/src/net/strategies/FailoverStrategy.h b/src/net/strategies/FailoverStrategy.h index c8e24fb1..7c477b76 100644 --- a/src/net/strategies/FailoverStrategy.h +++ b/src/net/strategies/FailoverStrategy.h @@ -48,7 +48,6 @@ public: int64_t submit(const JobResult &result) override; void connect() override; - void release() override; void resume() override; void stop() override; void tick(uint64_t now) override; @@ -62,7 +61,6 @@ protected: private: void add(const Url *url); - bool m_release; const bool m_quiet; const int m_retries; const int m_retryPause; diff --git a/src/net/strategies/SinglePoolStrategy.cpp b/src/net/strategies/SinglePoolStrategy.cpp index b0d98519..fc7f209e 100644 --- a/src/net/strategies/SinglePoolStrategy.cpp +++ b/src/net/strategies/SinglePoolStrategy.cpp @@ -30,7 +30,6 @@ SinglePoolStrategy::SinglePoolStrategy(const Url *url, int retryPause, IStrategyListener *listener, bool quiet) : m_active(false), - m_release(false), m_listener(listener) { m_client = new Client(0, Platform::userAgent(), this); @@ -42,7 +41,7 @@ SinglePoolStrategy::SinglePoolStrategy(const Url *url, int retryPause, IStrategy SinglePoolStrategy::~SinglePoolStrategy() { - delete m_client; + m_client->deleteLater(); } @@ -58,13 +57,6 @@ void SinglePoolStrategy::connect() } -void SinglePoolStrategy::release() -{ - m_release = true; - m_client->disconnect(); -} - - void SinglePoolStrategy::resume() { if (!isActive()) { @@ -89,11 +81,6 @@ void SinglePoolStrategy::tick(uint64_t now) void SinglePoolStrategy::onClose(Client *client, int failures) { - if (m_release) { - delete this; - return; - } - if (!isActive()) { return; } diff --git a/src/net/strategies/SinglePoolStrategy.h b/src/net/strategies/SinglePoolStrategy.h index 18d2192b..d5682cf7 100644 --- a/src/net/strategies/SinglePoolStrategy.h +++ b/src/net/strategies/SinglePoolStrategy.h @@ -45,7 +45,6 @@ public: int64_t submit(const JobResult &result) override; void connect() override; - void release() override; void resume() override; void stop() override; void tick(uint64_t now) override; @@ -58,7 +57,6 @@ protected: private: bool m_active; - bool m_release; Client *m_client; IStrategyListener *m_listener; }; From 673a1291e1342d2363dca1679b48dd22e7aa40fc Mon Sep 17 00:00:00 2001 From: XMRig Date: Sat, 24 Mar 2018 09:41:32 +0700 Subject: [PATCH 15/25] Randomized donation start time. --- src/donate.h | 5 +++-- src/net/strategies/DonateStrategy.cpp | 13 +++++++++---- src/net/strategies/DonateStrategy.h | 2 +- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/donate.h b/src/donate.h index 3a000948..e8230b87 100644 --- a/src/donate.h +++ b/src/donate.h @@ -4,8 +4,8 @@ * Copyright 2014 Lucas Jones * Copyright 2014-2016 Wolf9466 * Copyright 2016 Jay D Dee - * Copyright 2016-2017 XMRig - * + * Copyright 2017-2018 XMR-Stak , + * Copyright 2016-2018 XMRig , * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -31,6 +31,7 @@ * Percentage of your hashing power that you want to donate to the developer, can be 0 if you don't want to do that. * Example of how it works for the default setting of 1: * You miner will mine into your usual pool for 99 minutes, then switch to the developer's pool for 1 minute. + * Since v2.5.1 start time randomized in range from 50 to 150 minutes minus donation time. * Switching is instant, and only happens after a successful connection, so you never loose any hashes. * * If you plan on changing this setting to 0 please consider making a one off donation to my wallet: diff --git a/src/net/strategies/DonateStrategy.cpp b/src/net/strategies/DonateStrategy.cpp index ca2f94ca..ae707e21 100644 --- a/src/net/strategies/DonateStrategy.cpp +++ b/src/net/strategies/DonateStrategy.cpp @@ -41,6 +41,11 @@ const static char *kDonatePool1 = "miner.fee.xmrig.com"; const static char *kDonatePool2 = "emergency.fee.xmrig.com"; +static inline int random(int min, int max){ + return min + rand() / (RAND_MAX / (max - min + 1) + 1); +} + + DonateStrategy::DonateStrategy(int level, const char *user, int algo, IStrategyListener *listener) : m_active(false), m_donateTime(level * 60 * 1000), @@ -69,7 +74,7 @@ DonateStrategy::DonateStrategy(int level, const char *user, int algo, IStrategyL m_timer.data = this; uv_timer_init(uv_default_loop(), &m_timer); - idle(); + idle(random(3000, 9000) * 1000 - m_donateTime); } @@ -132,9 +137,9 @@ void DonateStrategy::onResultAccepted(IStrategy *strategy, Client *client, const } -void DonateStrategy::idle() +void DonateStrategy::idle(uint64_t timeout) { - uv_timer_start(&m_timer, DonateStrategy::onTimer, m_idleTime, 0); + uv_timer_start(&m_timer, DonateStrategy::onTimer, timeout, 0); } @@ -145,7 +150,7 @@ void DonateStrategy::suspend() m_active = false; m_listener->onPause(this); - idle(); + idle(m_idleTime); } diff --git a/src/net/strategies/DonateStrategy.h b/src/net/strategies/DonateStrategy.h index 9d7566f9..4ef29958 100644 --- a/src/net/strategies/DonateStrategy.h +++ b/src/net/strategies/DonateStrategy.h @@ -61,7 +61,7 @@ protected: void onResultAccepted(IStrategy *strategy, Client *client, const SubmitResult &result, const char *error) override; private: - void idle(); + void idle(uint64_t timeout); void suspend(); static void onTimer(uv_timer_t *handle); From 1011fd48916446ac4d03f619760c5b7615139164 Mon Sep 17 00:00:00 2001 From: XMRig Date: Sat, 24 Mar 2018 10:14:21 +0700 Subject: [PATCH 16/25] Partial fix for ARMv7 --- src/crypto/CryptoNight_monero.h | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/crypto/CryptoNight_monero.h b/src/crypto/CryptoNight_monero.h index 61d63b46..a667a3b3 100644 --- a/src/crypto/CryptoNight_monero.h +++ b/src/crypto/CryptoNight_monero.h @@ -27,12 +27,22 @@ // VARIANT ALTERATIONS -#define VARIANT1_INIT(part) \ +#ifndef XMRIG_ARM +# define VARIANT1_INIT(part) \ uint64_t tweak1_2_##part = 0; \ if (VARIANT > 0) { \ tweak1_2_##part = (*reinterpret_cast(input + 35 + part * size) ^ \ *(reinterpret_cast(ctx->state##part) + 24)); \ } +#else +# define VARIANT1_INIT(part) \ + uint64_t tweak1_2_##part = 0; \ + if (VARIANT > 0) { \ + volatile const uint64_t a = *reinterpret_cast(input + 35 + part * size); \ + volatile const uint64_t b = *(reinterpret_cast(ctx->state##part) + 24); \ + tweak1_2_##part = a ^ b; \ + } +#endif #define VARIANT1_1(p) \ if (VARIANT > 0) { \ From e99928aa44a3b5dcc5b3ecd51025800b4386eb3a Mon Sep 17 00:00:00 2001 From: xmrig Date: Sat, 24 Mar 2018 11:02:04 +0700 Subject: [PATCH 17/25] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 850847ff..89109c36 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ - [#459](https://github.com/xmrig/xmrig/issues/459) Fixed regression (version 2.5.0 affected) with connection to **xmr.f2pool.com**. # v2.5.0 -- [#434](https://github.com/xmrig/xmrig/issues/434) **Added support for Monero v7 PoW, scheduled on March 28.** +- [#434](https://github.com/xmrig/xmrig/issues/434) **Added support for Monero v7 PoW, scheduled on April 6.** - Added full IPv6 support. - Added protocol extension, when use the miner with xmrig-proxy 2.5+ no more need manually specify `nicehash` option. - [#123](https://github.com/xmrig/xmrig-proxy/issues/123) Fixed regression (all versions since 2.4 affected) fragmented responses from pool/proxy was parsed incorrectly. From f8f89a0946df69566e4364e3da331b11ce9f68d6 Mon Sep 17 00:00:00 2001 From: XMRig Date: Sat, 24 Mar 2018 13:04:04 +0700 Subject: [PATCH 18/25] v2.5.1 release candidate. --- README.md | 2 ++ src/config.json | 11 ++++++----- src/version.h | 4 ++-- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 001df323..cacae1dc 100644 --- a/README.md +++ b/README.md @@ -66,11 +66,13 @@ Use [config.xmrig.com](https://config.xmrig.com/xmrig) to generate, edit or shar --cpu-priority set process priority (0 idle, 2 normal to 5 highest) --no-huge-pages disable huge pages support --no-color disable colored output + --variant algorithm PoW variant --donate-level=N donate level, default 5% (5 minutes in 100 minutes) --user-agent set custom user-agent string for pool -B, --background run the miner in the background -c, --config=FILE load a JSON-format configuration file -l, --log-file=FILE log all output to a file + -S, --syslog use system log for output messages --max-cpu-usage=N maximum CPU usage for automatic threads mode (default 75) --safe safe adjust threads and av settings for current CPU --nicehash enable nicehash/xmrig-proxy support diff --git a/src/config.json b/src/config.json index 7813d4b9..acaff146 100644 --- a/src/config.json +++ b/src/config.json @@ -16,11 +16,12 @@ "threads": null, // number of miner threads "pools": [ { - "url": "pool.minemonero.pro:5555", // URL of mining server - "user": "", // username for mining server - "pass": "x", // password for mining server - "keepalive": true, // send keepalived for prevent timeout (need pool support) - "nicehash": false // enable nicehash/xmrig-proxy support + "url": "failover.xmrig.com:443", // URL of mining server + "user": "YOUR_WALLET", // username for mining server + "pass": "x", // password for mining server + "keepalive": true, // send keepalived for prevent timeout (need pool support) + "nicehash": false // enable nicehash/xmrig-proxy support + "variant": -1 // algorithm PoW variant } ], "api": { diff --git a/src/version.h b/src/version.h index cfaf7e9c..c0559845 100644 --- a/src/version.h +++ b/src/version.h @@ -27,7 +27,7 @@ #define APP_ID "xmrig" #define APP_NAME "XMRig" #define APP_DESC "XMRig CPU miner" -#define APP_VERSION "2.5.0" +#define APP_VERSION "2.5.1" #define APP_DOMAIN "xmrig.com" #define APP_SITE "www.xmrig.com" #define APP_COPYRIGHT "Copyright (C) 2016-2018 xmrig.com" @@ -35,7 +35,7 @@ #define APP_VER_MAJOR 2 #define APP_VER_MINOR 5 -#define APP_VER_BUILD 0 +#define APP_VER_BUILD 1 #define APP_VER_REV 0 #ifdef _MSC_VER From 89608ade3b4a4fafed8788f57ae2a854a1d16bda Mon Sep 17 00:00:00 2001 From: XMRig Date: Sat, 24 Mar 2018 13:45:54 +0700 Subject: [PATCH 19/25] Removed unused private field in FailoverStrategy class. --- src/net/strategies/FailoverStrategy.cpp | 1 - src/net/strategies/FailoverStrategy.h | 1 - 2 files changed, 2 deletions(-) diff --git a/src/net/strategies/FailoverStrategy.cpp b/src/net/strategies/FailoverStrategy.cpp index 32dbaf1b..dbfeb311 100644 --- a/src/net/strategies/FailoverStrategy.cpp +++ b/src/net/strategies/FailoverStrategy.cpp @@ -34,7 +34,6 @@ FailoverStrategy::FailoverStrategy(const std::vector &urls, int retryPause m_retryPause(retryPause), m_active(-1), m_index(0), - m_remaining(0), m_listener(listener) { for (const Url *url : urls) { diff --git a/src/net/strategies/FailoverStrategy.h b/src/net/strategies/FailoverStrategy.h index 7c477b76..8ad767ca 100644 --- a/src/net/strategies/FailoverStrategy.h +++ b/src/net/strategies/FailoverStrategy.h @@ -66,7 +66,6 @@ private: const int m_retryPause; int m_active; int m_index; - int m_remaining; IStrategyListener *m_listener; std::vector m_pools; }; From dd7f70d6e84a34ac6a385017fd87d983811070f1 Mon Sep 17 00:00:00 2001 From: XMRig Date: Sat, 24 Mar 2018 13:55:45 +0700 Subject: [PATCH 20/25] Fix error in config.json --- src/config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.json b/src/config.json index acaff146..858435d2 100644 --- a/src/config.json +++ b/src/config.json @@ -20,7 +20,7 @@ "user": "YOUR_WALLET", // username for mining server "pass": "x", // password for mining server "keepalive": true, // send keepalived for prevent timeout (need pool support) - "nicehash": false // enable nicehash/xmrig-proxy support + "nicehash": false, // enable nicehash/xmrig-proxy support "variant": -1 // algorithm PoW variant } ], From 38da8ef86cbd806c6b396189ac4f148ef3d0729f Mon Sep 17 00:00:00 2001 From: xmrig Date: Sun, 25 Mar 2018 15:04:00 +0700 Subject: [PATCH 21/25] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index cacae1dc..59aa053c 100644 --- a/README.md +++ b/README.md @@ -125,9 +125,9 @@ Please note performance is highly dependent on system load. The numbers above ar ### SHA-256 ``` 232ea929f7219c8de81c7e6fcae7437d40d8128cf55b597a6e1fca0cd77f9f5b xmrig-2.5.0-xenial-amd64.tar.gz/xmrig-2.5.0/xmrig -6149ffed21e740cac12aa61b2fdd17248cbd3e51bab2289d2766aad1d29df910 xmrig-2.5.0-gcc-win32.zip/xmrig.exe -9c89f80e21db906439a7a1b333b8215dbe07d8e42f98a63f6c10c954288a7108 xmrig-2.5.0-gcc-win64.zip/xmrig.exe -b50773c5a74ca9921597a1152e2469ec266cc89eb9765038db7e876f0bcece73 xmrig-2.5.0-msvc-win64.zip/xmrig.exe +d2e53adb26f01ff786aab75433f8deb36beeb4e85d567428b1a596ce6a4b9034 xmrig-2.5.1-gcc-win32.zip/xmrig.exe +10740d66732f7cc48b619db2c26756e0238b6ab5e85cd6901906635ecc30af13 xmrig-2.5.1-gcc-win64.zip/xmrig.exe +33d46714b664e8e0c85c26f636ec87cb60def7008c75249a8cc09a586ec6dd5a xmrig-2.5.1-msvc-win64.zip/xmrig.exe ``` ## Contacts From f852996f97ded849e39f4ddd66f15ad047c6d6e6 Mon Sep 17 00:00:00 2001 From: xmrig Date: Sun, 25 Mar 2018 15:14:19 +0700 Subject: [PATCH 22/25] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 59aa053c..da371410 100644 --- a/README.md +++ b/README.md @@ -124,7 +124,7 @@ Please note performance is highly dependent on system load. The numbers above ar ## Release checksums ### SHA-256 ``` -232ea929f7219c8de81c7e6fcae7437d40d8128cf55b597a6e1fca0cd77f9f5b xmrig-2.5.0-xenial-amd64.tar.gz/xmrig-2.5.0/xmrig +8e30d51cccf8f32e26648fd54da9a39146c4b15ea69284c5e7c974780dfdab4a xmrig-2.5.1-xenial-amd64.tar.gz/xmrig-2.5.1/xmrig d2e53adb26f01ff786aab75433f8deb36beeb4e85d567428b1a596ce6a4b9034 xmrig-2.5.1-gcc-win32.zip/xmrig.exe 10740d66732f7cc48b619db2c26756e0238b6ab5e85cd6901906635ecc30af13 xmrig-2.5.1-gcc-win64.zip/xmrig.exe 33d46714b664e8e0c85c26f636ec87cb60def7008c75249a8cc09a586ec6dd5a xmrig-2.5.1-msvc-win64.zip/xmrig.exe From 6f4ed5f66d1956a3936979b1015e72f8b374e8e3 Mon Sep 17 00:00:00 2001 From: XMRig Date: Mon, 26 Mar 2018 11:47:01 +0700 Subject: [PATCH 23/25] #478 Fixed totally broken reconnect. --- cmake/flags.cmake | 4 ++++ src/App_unix.cpp | 6 ++++-- src/net/Client.cpp | 49 +++++++++++++++++++++++++++++++++------------- src/net/Client.h | 1 + 4 files changed, 44 insertions(+), 16 deletions(-) diff --git a/cmake/flags.cmake b/cmake/flags.cmake index 488f1236..13e50564 100644 --- a/cmake/flags.cmake +++ b/cmake/flags.cmake @@ -6,6 +6,10 @@ if ("${CMAKE_BUILD_TYPE}" STREQUAL "") set(CMAKE_BUILD_TYPE Release) endif() +if (CMAKE_BUILD_TYPE STREQUAL "Release") + add_definitions(/DNDEBUG) +endif() + if (CMAKE_CXX_COMPILER_ID MATCHES GNU) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wno-strict-aliasing") diff --git a/src/App_unix.cpp b/src/App_unix.cpp index 66957208..674a53e6 100644 --- a/src/App_unix.cpp +++ b/src/App_unix.cpp @@ -4,8 +4,8 @@ * Copyright 2014 Lucas Jones * Copyright 2014-2016 Wolf9466 * Copyright 2016 Jay D Dee - * Copyright 2016-2017 XMRig - * + * Copyright 2017-2018 XMR-Stak , + * Copyright 2016-2018 XMRig , * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -36,6 +36,8 @@ void App::background() { + signal(SIGPIPE, SIG_IGN); + if (m_options->affinity() != -1L) { Cpu::setAffinity(-1, m_options->affinity()); } diff --git a/src/net/Client.cpp b/src/net/Client.cpp index b4506e44..c8a93f24 100644 --- a/src/net/Client.cpp +++ b/src/net/Client.cpp @@ -21,6 +21,7 @@ * along with this program. If not, see . */ +#include #include #include #include @@ -204,16 +205,30 @@ bool Client::close() setState(ClosingState); - uv_read_stop(reinterpret_cast(m_socket)); + uv_stream_t *stream = reinterpret_cast(m_socket); - uv_shutdown(new uv_shutdown_t, reinterpret_cast(m_socket), [](uv_shutdown_t* req, int status) { + if (uv_is_readable(stream) == 1) { + uv_read_stop(stream); + } - if (uv_is_closing(reinterpret_cast(req->handle)) == 0) { - uv_close(reinterpret_cast(req->handle), Client::onClose); + if (uv_is_writable(stream) == 1) { + const int rc = uv_shutdown(new uv_shutdown_t, stream, [](uv_shutdown_t* req, int status) { + if (uv_is_closing(reinterpret_cast(req->handle)) == 0) { + uv_close(reinterpret_cast(req->handle), Client::onClose); + } + + delete req; + }); + + assert(rc == 0); + + if (rc != 0) { + onClose(); } - - delete req; - }); + } + else { + uv_close(reinterpret_cast(m_socket), Client::onClose); + } return true; } @@ -442,6 +457,18 @@ void Client::login() } +void Client::onClose() +{ + delete m_socket; + + m_stream = nullptr; + m_socket = nullptr; + setState(UnconnectedState); + + reconnect(); +} + + void Client::parse(char *line, size_t len) { startTimeout(); @@ -655,13 +682,7 @@ void Client::onClose(uv_handle_t *handle) return; } - delete client->m_socket; - - client->m_stream = nullptr; - client->m_socket = nullptr; - client->setState(UnconnectedState); - - client->reconnect(); + client->onClose(); } diff --git a/src/net/Client.h b/src/net/Client.h index cf426119..fff7a156 100644 --- a/src/net/Client.h +++ b/src/net/Client.h @@ -87,6 +87,7 @@ private: void connect(const std::vector &ipv4, const std::vector &ipv6); void connect(sockaddr *addr); void login(); + void onClose(); void parse(char *line, size_t len); void parseExtensions(const rapidjson::Value &value); void parseNotification(const char *method, const rapidjson::Value ¶ms, const rapidjson::Value &error); From ec08550fd92f79c576cbe9adf3dc874c53751b37 Mon Sep 17 00:00:00 2001 From: XMRig Date: Mon, 26 Mar 2018 13:34:04 +0700 Subject: [PATCH 24/25] v2.5.2 --- CHANGELOG.md | 3 +++ src/version.h | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 89109c36..ab31e698 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +# v2.5.2 +- [#448](https://github.com/xmrig/xmrig/issues/478) Fixed broken reconnect. + # v2.5.1 - [#454](https://github.com/xmrig/xmrig/issues/454) Fixed build with libmicrohttpd version below v0.9.35. - [#456](https://github.com/xmrig/xmrig/issues/459) Verbose errors related to donation pool was not fully silenced. diff --git a/src/version.h b/src/version.h index c0559845..060edcb7 100644 --- a/src/version.h +++ b/src/version.h @@ -27,7 +27,7 @@ #define APP_ID "xmrig" #define APP_NAME "XMRig" #define APP_DESC "XMRig CPU miner" -#define APP_VERSION "2.5.1" +#define APP_VERSION "2.5.2" #define APP_DOMAIN "xmrig.com" #define APP_SITE "www.xmrig.com" #define APP_COPYRIGHT "Copyright (C) 2016-2018 xmrig.com" @@ -35,7 +35,7 @@ #define APP_VER_MAJOR 2 #define APP_VER_MINOR 5 -#define APP_VER_BUILD 1 +#define APP_VER_BUILD 2 #define APP_VER_REV 0 #ifdef _MSC_VER From 1bd05d136bde25c00bd0809810c2af96dc639b00 Mon Sep 17 00:00:00 2001 From: xmrig Date: Mon, 26 Mar 2018 13:59:20 +0700 Subject: [PATCH 25/25] Update README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index da371410..962408e9 100644 --- a/README.md +++ b/README.md @@ -124,10 +124,10 @@ Please note performance is highly dependent on system load. The numbers above ar ## Release checksums ### SHA-256 ``` -8e30d51cccf8f32e26648fd54da9a39146c4b15ea69284c5e7c974780dfdab4a xmrig-2.5.1-xenial-amd64.tar.gz/xmrig-2.5.1/xmrig -d2e53adb26f01ff786aab75433f8deb36beeb4e85d567428b1a596ce6a4b9034 xmrig-2.5.1-gcc-win32.zip/xmrig.exe -10740d66732f7cc48b619db2c26756e0238b6ab5e85cd6901906635ecc30af13 xmrig-2.5.1-gcc-win64.zip/xmrig.exe -33d46714b664e8e0c85c26f636ec87cb60def7008c75249a8cc09a586ec6dd5a xmrig-2.5.1-msvc-win64.zip/xmrig.exe +b070d06a3615f3db67ad3beab43d6d21f3c88026aa2b4726a93df47145cd30ec xmrig-2.5.2-xenial-amd64.tar.gz/xmrig-2.5.2/xmrig +4852135d3f04fd450ba39abce51ca40ff9131d222220c8b30804be05f6679295 xmrig-2.5.2-gcc-win32.zip/xmrig.exe +284309d07f08261af19c937ece6d2031910d9124a7359c207ded65890b2d7c5f xmrig-2.5.2-gcc-win64.zip/xmrig.exe +e1dc46158a578fb030538fb06e5663a6acc5763545fb447a00ce0a6b388c5226 xmrig-2.5.2-msvc-win64.zip/xmrig.exe ``` ## Contacts