From 7fc7b976bfd8f72620983bf7cb59d11177a50d30 Mon Sep 17 00:00:00 2001
From: XMRig <support@xmrig.com>
Date: Fri, 16 Oct 2020 20:29:11 +0700
Subject: [PATCH] Removed m_bench field from Job class.

---
 src/backend/common/Workers.cpp      |  2 +-
 src/backend/cpu/CpuBackend.cpp      |  2 +-
 src/backend/cpu/CpuConfig.cpp       |  4 ++--
 src/backend/cpu/CpuConfig.h         |  2 +-
 src/backend/cpu/CpuLaunchData.cpp   |  3 ++-
 src/backend/cpu/CpuLaunchData.h     |  3 ++-
 src/backend/cpu/CpuWorker.cpp       | 33 ++++++++---------------------
 src/backend/cpu/CpuWorker.h         |  3 ++-
 src/backend/cuda/CudaLaunchData.cpp |  4 ++--
 src/backend/cuda/CudaLaunchData.h   |  3 ++-
 src/backend/opencl/OclLaunchData.h  |  1 +
 src/base/net/stratum/Job.cpp        |  8 -------
 src/base/net/stratum/Job.h          |  9 --------
 src/base/net/stratum/NullClient.cpp |  1 -
 src/base/net/stratum/Pool.h         |  2 +-
 src/base/net/stratum/Pools.cpp      | 24 ++++++++++-----------
 src/base/net/stratum/Pools.h        |  3 ++-
 src/net/Network.cpp                 |  4 +++-
 src/net/Network.h                   |  1 +
 19 files changed, 44 insertions(+), 68 deletions(-)

diff --git a/src/backend/common/Workers.cpp b/src/backend/common/Workers.cpp
index 3b56e5fef..1659d7302 100644
--- a/src/backend/common/Workers.cpp
+++ b/src/backend/common/Workers.cpp
@@ -112,7 +112,7 @@ void xmrig::Workers<T>::start(const std::vector<T> &data)
 {
 #   ifdef XMRIG_FEATURE_BENCHMARK
     if (!data.empty()) {
-        d_ptr->bench     = data.front().miner->job().bench();
+        d_ptr->bench     = data.front().benchSize;
         d_ptr->benchAlgo = data.front().algorithm;
     }
 #   endif
diff --git a/src/backend/cpu/CpuBackend.cpp b/src/backend/cpu/CpuBackend.cpp
index c3267d17f..cac4f85c1 100644
--- a/src/backend/cpu/CpuBackend.cpp
+++ b/src/backend/cpu/CpuBackend.cpp
@@ -335,7 +335,7 @@ void xmrig::CpuBackend::setJob(const Job &job)
 
     const CpuConfig &cpu = d_ptr->controller->config()->cpu();
 
-    std::vector<CpuLaunchData> threads = cpu.get(d_ptr->controller->miner(), job.algorithm());
+    std::vector<CpuLaunchData> threads = cpu.get(d_ptr->controller->miner(), job.algorithm(), d_ptr->controller->config()->pools().benchSize());
     if (!d_ptr->threads.empty() && d_ptr->threads.size() == threads.size() && std::equal(d_ptr->threads.begin(), d_ptr->threads.end(), threads.begin())) {
         return;
     }
diff --git a/src/backend/cpu/CpuConfig.cpp b/src/backend/cpu/CpuConfig.cpp
index 5c70795de..619813d27 100644
--- a/src/backend/cpu/CpuConfig.cpp
+++ b/src/backend/cpu/CpuConfig.cpp
@@ -113,7 +113,7 @@ size_t xmrig::CpuConfig::memPoolSize() const
 }
 
 
-std::vector<xmrig::CpuLaunchData> xmrig::CpuConfig::get(const Miner *miner, const Algorithm &algorithm) const
+std::vector<xmrig::CpuLaunchData> xmrig::CpuConfig::get(const Miner *miner, const Algorithm &algorithm, uint32_t benchSize) const
 {
     std::vector<CpuLaunchData> out;
     const CpuThreads &threads = m_threads.get(algorithm);
@@ -125,7 +125,7 @@ std::vector<xmrig::CpuLaunchData> xmrig::CpuConfig::get(const Miner *miner, cons
     out.reserve(threads.count());
 
     for (const CpuThread &thread : threads.data()) {
-        out.emplace_back(miner, algorithm, *this, thread);
+        out.emplace_back(miner, algorithm, *this, thread, benchSize);
     }
 
     return out;
diff --git a/src/backend/cpu/CpuConfig.h b/src/backend/cpu/CpuConfig.h
index 95defa67b..4add65531 100644
--- a/src/backend/cpu/CpuConfig.h
+++ b/src/backend/cpu/CpuConfig.h
@@ -72,7 +72,7 @@ public:
     bool isHwAES() const;
     rapidjson::Value toJSON(rapidjson::Document &doc) const;
     size_t memPoolSize() const;
-    std::vector<CpuLaunchData> get(const Miner *miner, const Algorithm &algorithm) const;
+    std::vector<CpuLaunchData> get(const Miner *miner, const Algorithm &algorithm, uint32_t benchSize) const;
     void read(const rapidjson::Value &value);
 
     inline bool isEnabled() const                       { return m_enabled; }
diff --git a/src/backend/cpu/CpuLaunchData.cpp b/src/backend/cpu/CpuLaunchData.cpp
index b0090a212..369288418 100644
--- a/src/backend/cpu/CpuLaunchData.cpp
+++ b/src/backend/cpu/CpuLaunchData.cpp
@@ -32,7 +32,7 @@
 #include <algorithm>
 
 
-xmrig::CpuLaunchData::CpuLaunchData(const Miner *miner, const Algorithm &algorithm, const CpuConfig &config, const CpuThread &thread) :
+xmrig::CpuLaunchData::CpuLaunchData(const Miner *miner, const Algorithm &algorithm, const CpuConfig &config, const CpuThread &thread, uint32_t benchSize) :
     algorithm(algorithm),
     assembly(config.assembly()),
     astrobwtAVX2(config.astrobwtAVX2()),
@@ -43,6 +43,7 @@ xmrig::CpuLaunchData::CpuLaunchData(const Miner *miner, const Algorithm &algorit
     priority(config.priority()),
     affinity(thread.affinity()),
     miner(miner),
+    benchSize(benchSize),
     intensity(std::min<uint32_t>(thread.intensity(), algorithm.maxIntensity()))
 {
 }
diff --git a/src/backend/cpu/CpuLaunchData.h b/src/backend/cpu/CpuLaunchData.h
index 86a8f97eb..1bc9a7fde 100644
--- a/src/backend/cpu/CpuLaunchData.h
+++ b/src/backend/cpu/CpuLaunchData.h
@@ -44,7 +44,7 @@ class Miner;
 class CpuLaunchData
 {
 public:
-    CpuLaunchData(const Miner *miner, const Algorithm &algorithm, const CpuConfig &config, const CpuThread &thread);
+    CpuLaunchData(const Miner *miner, const Algorithm &algorithm, const CpuConfig &config, const CpuThread &thread, uint32_t benchSize);
 
     bool isEqual(const CpuLaunchData &other) const;
     CnHash::AlgoVariant av() const;
@@ -66,6 +66,7 @@ public:
     const int priority;
     const int64_t affinity;
     const Miner *miner;
+    const uint32_t benchSize;
     const uint32_t intensity;
 };
 
diff --git a/src/backend/cpu/CpuWorker.cpp b/src/backend/cpu/CpuWorker.cpp
index 4be13fba0..fd1a5932b 100644
--- a/src/backend/cpu/CpuWorker.cpp
+++ b/src/backend/cpu/CpuWorker.cpp
@@ -58,18 +58,10 @@ static constexpr uint32_t kReserveCount = 32768;
 
 
 template<size_t N>
-inline bool nextRound(WorkerJob<N> &job)
+inline bool nextRound(WorkerJob<N> &job, uint32_t benchSize)
 {
-    const auto &currentJob = job.currentJob();
-
-#   ifdef XMRIG_FEATURE_BENCHMARK
-    const uint32_t rounds = currentJob.bench() ? 1 : kReserveCount;
-#   else
-    constexpr uint32_t rounds = kReserveCount;
-#   endif
-
-    if (!job.nextRound(rounds, 1)) {
-        JobResults::done(currentJob);
+    if (!job.nextRound(benchSize ? 1 : kReserveCount, 1)) {
+        JobResults::done(job.currentJob());
 
         return false;
     }
@@ -93,6 +85,7 @@ xmrig::CpuWorker<N>::CpuWorker(size_t id, const CpuLaunchData &data) :
     m_av(data.av()),
     m_astrobwtMaxSize(data.astrobwtMaxSize * 1000),
     m_miner(data.miner),
+    m_benchSize(data.benchSize),
     m_ctx()
 {
     m_memory = new VirtualMemory(m_algorithm.l3() * N, data.hugePages, false, true, m_node);
@@ -247,7 +240,7 @@ void xmrig::CpuWorker<N>::start()
                     randomx_calculate_hash_first(m_vm, tempHash, m_job.blob(), job.size());
                 }
 
-                if (!nextRound(m_job)) {
+                if (!nextRound(m_job, m_benchSize)) {
                     break;
                 }
 
@@ -267,7 +260,7 @@ void xmrig::CpuWorker<N>::start()
                     fn(job.algorithm())(m_job.blob(), job.size(), m_hash, m_ctx, job.height());
                 }
 
-                if (!nextRound(m_job)) {
+                if (!nextRound(m_job, m_benchSize)) {
                     break;
                 };
             }
@@ -277,8 +270,8 @@ void xmrig::CpuWorker<N>::start()
                     const uint64_t value = *reinterpret_cast<uint64_t*>(m_hash + (i * 32) + 24);
 
 #                   ifdef XMRIG_FEATURE_BENCHMARK
-                    if (job.bench()) {
-                        if (current_job_nonces[i] < job.bench()) {
+                    if (m_benchSize) {
+                        if (current_job_nonces[i] < m_benchSize) {
                             m_benchData ^= value;
                         }
                         else {
@@ -385,15 +378,7 @@ void xmrig::CpuWorker<N>::consumeJob()
         return;
     }
 
-    auto job = m_miner->job();
-
-#   ifdef XMRIG_FEATURE_BENCHMARK
-    const uint32_t rounds = job.bench() ? 1 : kReserveCount;
-#   else
-    constexpr uint32_t rounds = kReserveCount;
-#   endif
-
-    m_job.add(job, rounds, Nonce::CPU);
+    m_job.add(m_miner->job(), m_benchSize ? 1 : kReserveCount, Nonce::CPU);
 
 #   ifdef XMRIG_ALGO_RANDOMX
     if (m_job.currentJob().algorithm().family() == Algorithm::RANDOM_X) {
diff --git a/src/backend/cpu/CpuWorker.h b/src/backend/cpu/CpuWorker.h
index 4f96d7e2a..087156c24 100644
--- a/src/backend/cpu/CpuWorker.h
+++ b/src/backend/cpu/CpuWorker.h
@@ -73,6 +73,7 @@ private:
     void allocateCnCtx();
     void consumeJob();
 
+    alignas(16) uint8_t m_hash[N * 32]{ 0 };
     const Algorithm m_algorithm;
     const Assembly m_assembly;
     const bool m_astrobwtAVX2;
@@ -81,8 +82,8 @@ private:
     const CnHash::AlgoVariant m_av;
     const int m_astrobwtMaxSize;
     const Miner *m_miner;
+    const uint32_t m_benchSize;
     cryptonight_ctx *m_ctx[N];
-    alignas(16) uint8_t m_hash[N * 32]{ 0 };
     VirtualMemory *m_memory = nullptr;
     WorkerJob<N> m_job;
 
diff --git a/src/backend/cuda/CudaLaunchData.cpp b/src/backend/cuda/CudaLaunchData.cpp
index 11cf70c89..8a066c32a 100644
--- a/src/backend/cuda/CudaLaunchData.cpp
+++ b/src/backend/cuda/CudaLaunchData.cpp
@@ -30,9 +30,9 @@
 
 xmrig::CudaLaunchData::CudaLaunchData(const Miner *miner, const Algorithm &algorithm, const CudaThread &thread, const CudaDevice &device) :
     algorithm(algorithm),
-    miner(miner),
     device(device),
-    thread(thread)
+    thread(thread),
+    miner(miner)
 {
 }
 
diff --git a/src/backend/cuda/CudaLaunchData.h b/src/backend/cuda/CudaLaunchData.h
index 8bf2dbeba..bb8b0fb24 100644
--- a/src/backend/cuda/CudaLaunchData.h
+++ b/src/backend/cuda/CudaLaunchData.h
@@ -54,9 +54,10 @@ public:
     static const char *tag();
 
     const Algorithm algorithm;
-    const Miner *miner;
     const CudaDevice &device;
     const CudaThread thread;
+    const Miner *miner;
+    const uint32_t benchSize = 0;
 };
 
 
diff --git a/src/backend/opencl/OclLaunchData.h b/src/backend/opencl/OclLaunchData.h
index 73716b840..7cfd5d58f 100644
--- a/src/backend/opencl/OclLaunchData.h
+++ b/src/backend/opencl/OclLaunchData.h
@@ -67,6 +67,7 @@ public:
     const OclDevice device;
     const OclPlatform platform;
     const OclThread thread;
+    const uint32_t benchSize = 0;
 };
 
 
diff --git a/src/base/net/stratum/Job.cpp b/src/base/net/stratum/Job.cpp
index e826b8b89..fc17b5102 100644
--- a/src/base/net/stratum/Job.cpp
+++ b/src/base/net/stratum/Job.cpp
@@ -174,10 +174,6 @@ void xmrig::Job::copy(const Job &other)
     memcpy(m_rawBlob, other.m_rawBlob, sizeof(m_rawBlob));
     memcpy(m_rawTarget, other.m_rawTarget, sizeof(m_rawTarget));
 #   endif
-
-#   ifdef XMRIG_FEATURE_BENCHMARK
-    m_bench = other.m_bench;
-#   endif
 }
 
 
@@ -209,8 +205,4 @@ void xmrig::Job::move(Job &&other)
     memcpy(m_rawBlob, other.m_rawBlob, sizeof(m_rawBlob));
     memcpy(m_rawTarget, other.m_rawTarget, sizeof(m_rawTarget));
 #   endif
-
-#   ifdef XMRIG_FEATURE_BENCHMARK
-    m_bench = other.m_bench;
-#   endif
 }
diff --git a/src/base/net/stratum/Job.h b/src/base/net/stratum/Job.h
index 4507f67c7..ba5a0aa2e 100644
--- a/src/base/net/stratum/Job.h
+++ b/src/base/net/stratum/Job.h
@@ -111,11 +111,6 @@ public:
     inline Job &operator=(const Job &other)        { copy(other); return *this; }
     inline Job &operator=(Job &&other) noexcept    { move(std::move(other)); return *this; }
 
-#   ifdef XMRIG_FEATURE_BENCHMARK
-    inline uint32_t bench() const                       { return m_bench; }
-    inline void setBench(uint32_t bench)                { m_bench = bench; }
-#   endif
-
 private:
     void copy(const Job &other);
     void move(Job &&other);
@@ -140,10 +135,6 @@ private:
     char m_rawTarget[24]{};
     String m_rawSeedHash;
 #   endif
-
-#   ifdef XMRIG_FEATURE_BENCHMARK
-    uint32_t m_bench    = 0;
-#   endif
 };
 
 
diff --git a/src/base/net/stratum/NullClient.cpp b/src/base/net/stratum/NullClient.cpp
index a93588810..5655ff207 100644
--- a/src/base/net/stratum/NullClient.cpp
+++ b/src/base/net/stratum/NullClient.cpp
@@ -59,5 +59,4 @@ void xmrig::NullClient::setPool(const Pool& pool)
     }
 
     m_job.setAlgorithm(m_pool.algorithm().id());
-    m_job.setBench(m_pool.benchSize());
 }
diff --git a/src/base/net/stratum/Pool.h b/src/base/net/stratum/Pool.h
index 271e91068..5dd749568 100644
--- a/src/base/net/stratum/Pool.h
+++ b/src/base/net/stratum/Pool.h
@@ -113,7 +113,7 @@ public:
     inline void setUser(const String &user)             { m_user = user; }
 
 #   ifdef XMRIG_FEATURE_BENCHMARK
-    inline uint64_t benchSize() const                   { return m_benchSize; }
+    inline uint32_t benchSize() const                   { return m_benchSize; }
 #   endif
 
     inline bool operator!=(const Pool &other) const     { return !isEqual(other); }
diff --git a/src/base/net/stratum/Pools.cpp b/src/base/net/stratum/Pools.cpp
index b765a9ef6..5dd233522 100644
--- a/src/base/net/stratum/Pools.cpp
+++ b/src/base/net/stratum/Pools.cpp
@@ -65,18 +65,6 @@ bool xmrig::Pools::isEqual(const Pools &other) const
 }
 
 
-int xmrig::Pools::donateLevel() const
-{
-#   ifdef XMRIG_FEATURE_BENCHMARK
-    if (m_data.size() == 1 && m_data.front().mode() == Pool::MODE_BENCHMARK) {
-        return 0;
-    }
-#   endif
-
-    return m_donateLevel;
-}
-
-
 xmrig::IStrategy *xmrig::Pools::createStrategy(IStrategyListener *listener) const
 {
     if (active() == 1) {
@@ -153,6 +141,18 @@ void xmrig::Pools::load(const IJsonReader &reader)
 }
 
 
+uint32_t xmrig::Pools::benchSize() const
+{
+#   ifdef XMRIG_FEATURE_BENCHMARK
+    if (m_data.size() == 1 && m_data.front().mode() == Pool::MODE_BENCHMARK) {
+        return m_data.front().benchSize();
+    }
+#   endif
+
+    return 0;
+}
+
+
 void xmrig::Pools::print() const
 {
     size_t i = 1;
diff --git a/src/base/net/stratum/Pools.h b/src/base/net/stratum/Pools.h
index 9c7bda671..fb92f13fc 100644
--- a/src/base/net/stratum/Pools.h
+++ b/src/base/net/stratum/Pools.h
@@ -58,6 +58,7 @@ public:
     Pools();
 
     inline const std::vector<Pool> &data() const        { return m_data; }
+    inline int donateLevel() const                      { return benchSize() ? 0 : m_donateLevel; }
     inline int retries() const                          { return m_retries; }
     inline int retryPause() const                       { return m_retryPause; }
     inline ProxyDonate proxyDonate() const              { return m_proxyDonate; }
@@ -66,10 +67,10 @@ public:
     inline bool operator==(const Pools &other) const    { return isEqual(other); }
 
     bool isEqual(const Pools &other) const;
-    int donateLevel() const;
     IStrategy *createStrategy(IStrategyListener *listener) const;
     rapidjson::Value toJSON(rapidjson::Document &doc) const;
     size_t active() const;
+    uint32_t benchSize() const;
     void load(const IJsonReader &reader);
     void print() const;
 
diff --git a/src/net/Network.cpp b/src/net/Network.cpp
index d22e793f0..6432db6e9 100644
--- a/src/net/Network.cpp
+++ b/src/net/Network.cpp
@@ -128,6 +128,8 @@ void xmrig::Network::onActive(IStrategy *strategy, IClient *client)
 
 #   ifdef XMRIG_FEATURE_BENCHMARK
     if (pool.mode() == Pool::MODE_BENCHMARK) {
+        m_benchSize = pool.benchSize();
+
         LOG_NOTICE("%s " MAGENTA_BOLD("start benchmark ") "hashes " CYAN_BOLD("%" PRIu64 "M") " algo " WHITE_BOLD("%s") " print_time " CYAN_BOLD("%us"),
                    Tags::bench(),
                    pool.benchSize() / 1000000,
@@ -270,7 +272,7 @@ void xmrig::Network::setJob(IClient *client, const Job &job, bool donate)
     const char *scale = NetworkState::scaleDiff(diff);
 
 #   ifdef XMRIG_FEATURE_BENCHMARK
-    if (!job.bench())
+    if (!m_benchSize)
 #   endif
     {
         if (job.height()) {
diff --git a/src/net/Network.h b/src/net/Network.h
index 94d546572..0289b2d25 100644
--- a/src/net/Network.h
+++ b/src/net/Network.h
@@ -92,6 +92,7 @@ private:
     IStrategy *m_strategy   = nullptr;
     NetworkState *m_state   = nullptr;
     Timer *m_timer          = nullptr;
+    uint32_t m_benchSize    = 0;
 };