Removed non thread safe access to config.

This commit is contained in:
XMRig 2020-11-16 07:58:28 +07:00
parent ee677ef5c9
commit 926871cbe1
No known key found for this signature in database
GPG key ID: 446A53638BE94409
13 changed files with 24 additions and 27 deletions

View file

@ -5,8 +5,8 @@
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet> * Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
* Copyright 2016 Jay D Dee <jayddee246@gmail.com> * Copyright 2016 Jay D Dee <jayddee246@gmail.com>
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt> * Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh> * Copyright 2018-2020 SChernykh <https://github.com/SChernykh>
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com> * Copyright 2016-2020 XMRig <https://github.com/xmrig>, <support@xmrig.com>
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -35,7 +35,6 @@ namespace xmrig {
class VirtualMemory; class VirtualMemory;
class Job; class Job;
class Config;
class IWorker class IWorker
@ -49,7 +48,7 @@ public:
virtual size_t intensity() const = 0; virtual size_t intensity() const = 0;
virtual uint64_t rawHashes() const = 0; virtual uint64_t rawHashes() const = 0;
virtual void getHashrateData(uint64_t&, uint64_t&) const = 0; virtual void getHashrateData(uint64_t&, uint64_t&) const = 0;
virtual void start(Config*) = 0; virtual void start() = 0;
virtual void jobEarlyNotification(const Job&) = 0; virtual void jobEarlyNotification(const Job&) = 0;
# ifdef XMRIG_FEATURE_BENCHMARK # ifdef XMRIG_FEATURE_BENCHMARK

View file

@ -390,7 +390,7 @@ void xmrig::CpuBackend::start(IWorker *worker, bool ready)
mutex.unlock(); mutex.unlock();
if (ready) { if (ready) {
worker->start(d_ptr->controller->config()); worker->start();
} }
} }

View file

@ -116,16 +116,17 @@ size_t xmrig::CpuConfig::memPoolSize() const
std::vector<xmrig::CpuLaunchData> xmrig::CpuConfig::get(const Miner *miner, const Algorithm &algorithm, uint32_t benchSize) const std::vector<xmrig::CpuLaunchData> xmrig::CpuConfig::get(const Miner *miner, const Algorithm &algorithm, uint32_t benchSize) const
{ {
std::vector<CpuLaunchData> out; std::vector<CpuLaunchData> out;
const CpuThreads &threads = m_threads.get(algorithm); const auto &threads = m_threads.get(algorithm);
if (threads.isEmpty()) { if (threads.isEmpty()) {
return out; return out;
} }
out.reserve(threads.count()); const size_t count = threads.count();
out.reserve(count);
for (const CpuThread &thread : threads.data()) { for (const auto &thread : threads.data()) {
out.emplace_back(miner, algorithm, *this, thread, benchSize); out.emplace_back(miner, algorithm, *this, thread, benchSize, count);
} }
return out; return out;

View file

@ -32,7 +32,7 @@
#include <algorithm> #include <algorithm>
xmrig::CpuLaunchData::CpuLaunchData(const Miner *miner, const Algorithm &algorithm, const CpuConfig &config, const CpuThread &thread, uint32_t benchSize) : xmrig::CpuLaunchData::CpuLaunchData(const Miner *miner, const Algorithm &algorithm, const CpuConfig &config, const CpuThread &thread, uint32_t benchSize, size_t threads) :
algorithm(algorithm), algorithm(algorithm),
assembly(config.assembly()), assembly(config.assembly()),
astrobwtAVX2(config.astrobwtAVX2()), astrobwtAVX2(config.astrobwtAVX2()),
@ -43,6 +43,7 @@ xmrig::CpuLaunchData::CpuLaunchData(const Miner *miner, const Algorithm &algorit
priority(config.priority()), priority(config.priority()),
affinity(thread.affinity()), affinity(thread.affinity()),
miner(miner), miner(miner),
threads(threads),
benchSize(benchSize), benchSize(benchSize),
intensity(std::min<uint32_t>(thread.intensity(), algorithm.maxIntensity())) intensity(std::min<uint32_t>(thread.intensity(), algorithm.maxIntensity()))
{ {

View file

@ -44,7 +44,7 @@ class Miner;
class CpuLaunchData class CpuLaunchData
{ {
public: public:
CpuLaunchData(const Miner *miner, const Algorithm &algorithm, const CpuConfig &config, const CpuThread &thread, uint32_t benchSize); CpuLaunchData(const Miner *miner, const Algorithm &algorithm, const CpuConfig &config, const CpuThread &thread, uint32_t benchSize, size_t threads);
bool isEqual(const CpuLaunchData &other) const; bool isEqual(const CpuLaunchData &other) const;
CnHash::AlgoVariant av() const; CnHash::AlgoVariant av() const;
@ -66,6 +66,7 @@ public:
const int priority; const int priority;
const int64_t affinity; const int64_t affinity;
const Miner *miner; const Miner *miner;
const size_t threads;
const uint32_t benchSize; const uint32_t benchSize;
const uint32_t intensity; const uint32_t intensity;
}; };

View file

@ -86,6 +86,7 @@ xmrig::CpuWorker<N>::CpuWorker(size_t id, const CpuLaunchData &data) :
m_av(data.av()), m_av(data.av()),
m_astrobwtMaxSize(data.astrobwtMaxSize * 1000), m_astrobwtMaxSize(data.astrobwtMaxSize * 1000),
m_miner(data.miner), m_miner(data.miner),
m_threads(data.threads),
m_benchSize(data.benchSize), m_benchSize(data.benchSize),
m_ctx() m_ctx()
{ {
@ -199,7 +200,7 @@ bool xmrig::CpuWorker<N>::selfTest()
template<size_t N> template<size_t N>
void xmrig::CpuWorker<N>::start(xmrig::Config* config) void xmrig::CpuWorker<N>::start()
{ {
while (Nonce::sequence(Nonce::CPU) > 0) { while (Nonce::sequence(Nonce::CPU) > 0) {
if (Nonce::isPaused()) { if (Nonce::isPaused()) {
@ -220,10 +221,6 @@ void xmrig::CpuWorker<N>::start(xmrig::Config* config)
alignas(16) uint64_t tempHash[8] = {}; alignas(16) uint64_t tempHash[8] = {};
# endif # endif
# ifdef XMRIG_FEATURE_BENCHMARK
const size_t benchThreads = config->cpu().threads().get(m_job.currentJob().algorithm()).count();
# endif
while (!Nonce::isOutdated(Nonce::CPU, m_job.sequence())) { while (!Nonce::isOutdated(Nonce::CPU, m_job.sequence())) {
const Job &job = m_job.currentJob(); const Job &job = m_job.currentJob();
@ -253,7 +250,7 @@ void xmrig::CpuWorker<N>::start(xmrig::Config* config)
} }
// Make each hash dependent on the previous one in single thread benchmark to prevent cheating with multiple threads // Make each hash dependent on the previous one in single thread benchmark to prevent cheating with multiple threads
if (benchThreads == 1) { if (m_threads == 1) {
*(uint64_t*)(m_job.blob()) ^= m_benchData; *(uint64_t*)(m_job.blob()) ^= m_benchData;
} }
} }

View file

@ -43,7 +43,6 @@ namespace xmrig {
class RxVm; class RxVm;
class Config;
template<size_t N> template<size_t N>
@ -57,7 +56,7 @@ public:
protected: protected:
bool selfTest() override; bool selfTest() override;
void start(Config*) override; void start() override;
inline const VirtualMemory *memory() const override { return m_memory; } inline const VirtualMemory *memory() const override { return m_memory; }
inline size_t intensity() const override { return N; } inline size_t intensity() const override { return N; }
@ -83,6 +82,7 @@ private:
const CnHash::AlgoVariant m_av; const CnHash::AlgoVariant m_av;
const int m_astrobwtMaxSize; const int m_astrobwtMaxSize;
const Miner *m_miner; const Miner *m_miner;
const size_t m_threads;
const uint32_t m_benchSize; const uint32_t m_benchSize;
cryptonight_ctx *m_ctx[N]; cryptonight_ctx *m_ctx[N];
VirtualMemory *m_memory = nullptr; VirtualMemory *m_memory = nullptr;

View file

@ -481,7 +481,7 @@ void xmrig::CudaBackend::start(IWorker *worker, bool ready)
mutex.unlock(); mutex.unlock();
if (ready) { if (ready) {
worker->start(d_ptr->controller->config()); worker->start();
} }
} }

View file

@ -145,7 +145,7 @@ size_t xmrig::CudaWorker::intensity() const
} }
void xmrig::CudaWorker::start(xmrig::Config*) void xmrig::CudaWorker::start()
{ {
while (Nonce::sequence(Nonce::CUDA) > 0) { while (Nonce::sequence(Nonce::CUDA) > 0) {
if (!isReady()) { if (!isReady()) {

View file

@ -39,7 +39,6 @@ namespace xmrig {
class ICudaRunner; class ICudaRunner;
class Config;
class CudaWorker : public Worker class CudaWorker : public Worker
@ -59,7 +58,7 @@ public:
protected: protected:
bool selfTest() override; bool selfTest() override;
size_t intensity() const override; size_t intensity() const override;
void start(Config*) override; void start() override;
private: private:
bool consumeJob(); bool consumeJob();

View file

@ -463,7 +463,7 @@ void xmrig::OclBackend::start(IWorker *worker, bool ready)
mutex.unlock(); mutex.unlock();
if (ready) { if (ready) {
worker->start(d_ptr->controller->config()); worker->start();
} }
} }

View file

@ -163,7 +163,7 @@ size_t xmrig::OclWorker::intensity() const
} }
void xmrig::OclWorker::start(xmrig::Config*) void xmrig::OclWorker::start()
{ {
cl_uint results[0x100]; cl_uint results[0x100];

View file

@ -40,7 +40,6 @@ namespace xmrig {
class IOclRunner; class IOclRunner;
class Job; class Job;
class Config;
class OclWorker : public Worker class OclWorker : public Worker
@ -60,7 +59,7 @@ public:
protected: protected:
bool selfTest() override; bool selfTest() override;
size_t intensity() const override; size_t intensity() const override;
void start(Config*) override; void start() override;
private: private:
bool consumeJob(); bool consumeJob();