Fixed data races in miner

pull/166/head
SChernykh 2 years ago
parent 21d8cb917b
commit 2a77695832

@ -115,9 +115,7 @@ static int do_status(p2pool *m_pool, const char * /* args */)
m_pool->p2p_server()->print_status(); m_pool->p2p_server()->print_status();
} }
#ifdef WITH_RANDOMX #ifdef WITH_RANDOMX
if (m_pool->miner()) { m_pool->print_miner_status();
m_pool->miner()->print_status();
}
#endif #endif
bkg_jobs_tracker.print_status(); bkg_jobs_tracker.print_status();
return 0; return 0;

@ -35,7 +35,7 @@ namespace p2pool {
Miner::Miner(p2pool* pool, uint32_t threads) Miner::Miner(p2pool* pool, uint32_t threads)
: m_pool(pool) : m_pool(pool)
, m_threads(threads) , m_threads(threads)
, m_stopped(false) , m_stopped{ false }
, m_startTimestamp(high_resolution_clock::now()) , m_startTimestamp(high_resolution_clock::now())
, m_nonce(0) , m_nonce(0)
, m_nonceTimestamp(m_startTimestamp) , m_nonceTimestamp(m_startTimestamp)
@ -43,7 +43,7 @@ Miner::Miner(p2pool* pool, uint32_t threads)
, m_totalHashes(0) , m_totalHashes(0)
, m_sharesFound(0) , m_sharesFound(0)
, m_job{} , m_job{}
, m_jobIndex(0) , m_jobIndex{ 0 }
{ {
on_block(m_pool->block_template()); on_block(m_pool->block_template());

@ -49,7 +49,7 @@ private:
}; };
std::vector<WorkerData*> m_minerThreads; std::vector<WorkerData*> m_minerThreads;
volatile bool m_stopped; std::atomic<bool> m_stopped;
std::chrono::high_resolution_clock::time_point m_startTimestamp; std::chrono::high_resolution_clock::time_point m_startTimestamp;
@ -75,7 +75,7 @@ private:
void set_nonce(uint32_t nonce, uint32_t extra_nonce); void set_nonce(uint32_t nonce, uint32_t extra_nonce);
}; };
Job m_job[2]; Job m_job[2];
volatile uint32_t m_jobIndex; std::atomic<uint32_t> m_jobIndex;
void run(WorkerData* data); void run(WorkerData* data);
}; };

@ -110,6 +110,9 @@ p2pool::p2pool(int argc, char* argv[])
uv_rwlock_init_checked(&m_mainchainLock); uv_rwlock_init_checked(&m_mainchainLock);
uv_rwlock_init_checked(&m_minerDataLock); uv_rwlock_init_checked(&m_minerDataLock);
uv_mutex_init_checked(&m_foundBlocksLock); uv_mutex_init_checked(&m_foundBlocksLock);
#ifdef WITH_RANDOMX
uv_mutex_init_checked(&m_minerLock);
#endif
uv_mutex_init_checked(&m_submitBlockDataLock); uv_mutex_init_checked(&m_submitBlockDataLock);
m_api = m_params->m_apiPath.empty() ? nullptr : new p2pool_api(m_params->m_apiPath, m_params->m_localStats); m_api = m_params->m_apiPath.empty() ? nullptr : new p2pool_api(m_params->m_apiPath, m_params->m_localStats);
@ -152,6 +155,9 @@ p2pool::~p2pool()
uv_rwlock_destroy(&m_mainchainLock); uv_rwlock_destroy(&m_mainchainLock);
uv_rwlock_destroy(&m_minerDataLock); uv_rwlock_destroy(&m_minerDataLock);
uv_mutex_destroy(&m_foundBlocksLock); uv_mutex_destroy(&m_foundBlocksLock);
#ifdef WITH_RANDOMX
uv_mutex_destroy(&m_minerLock);
#endif
uv_mutex_destroy(&m_submitBlockDataLock); uv_mutex_destroy(&m_submitBlockDataLock);
delete m_api; delete m_api;
@ -189,6 +195,17 @@ bool p2pool::get_seed(uint64_t height, hash& seed) const
return true; return true;
} }
#ifdef WITH_RANDOMX
void p2pool::print_miner_status()
{
MutexLock lock(m_minerLock);
if (m_miner) {
m_miner->print_status();
}
}
#endif
void p2pool::handle_tx(TxMempoolData& tx) void p2pool::handle_tx(TxMempoolData& tx)
{ {
if (!tx.weight || !tx.fee) { if (!tx.weight || !tx.fee) {
@ -691,10 +708,15 @@ void p2pool::update_median_timestamp()
void p2pool::stratum_on_block() void p2pool::stratum_on_block()
{ {
#ifdef WITH_RANDOMX #ifdef WITH_RANDOMX
if (m_miner) { {
m_miner->on_block(*m_blockTemplate); MutexLock lock(m_minerLock);
if (m_miner) {
m_miner->on_block(*m_blockTemplate);
}
} }
#endif #endif
if (m_stratumServer) { if (m_stratumServer) {
m_stratumServer->on_block(*m_blockTemplate); m_stratumServer->on_block(*m_blockTemplate);
} }
@ -1257,15 +1279,18 @@ bool p2pool::get_difficulty_at_height(uint64_t height, difficulty_type& diff)
void p2pool::start_mining(uint32_t threads) void p2pool::start_mining(uint32_t threads)
{ {
stop_mining(); stop_mining();
MutexLock lock(m_minerLock);
m_miner = new Miner(this, threads); m_miner = new Miner(this, threads);
} }
void p2pool::stop_mining() void p2pool::stop_mining()
{ {
Miner* miner = m_miner; MutexLock lock(m_minerLock);
if (miner) {
if (m_miner) {
delete m_miner;
m_miner = nullptr; m_miner = nullptr;
delete miner;
} }
} }
#endif #endif

@ -64,8 +64,9 @@ public:
StratumServer* stratum_server() const { return m_stratumServer; } StratumServer* stratum_server() const { return m_stratumServer; }
P2PServer* p2p_server() const { return m_p2pServer; } P2PServer* p2p_server() const { return m_p2pServer; }
#ifdef WITH_RANDOMX #ifdef WITH_RANDOMX
Miner* miner() const { return m_miner; } void print_miner_status();
#endif #endif
virtual void handle_tx(TxMempoolData& tx) override; virtual void handle_tx(TxMempoolData& tx) override;
@ -171,7 +172,9 @@ private:
std::atomic<uint32_t> m_serversStarted{ 0 }; std::atomic<uint32_t> m_serversStarted{ 0 };
StratumServer* m_stratumServer = nullptr; StratumServer* m_stratumServer = nullptr;
P2PServer* m_p2pServer = nullptr; P2PServer* m_p2pServer = nullptr;
#ifdef WITH_RANDOMX #ifdef WITH_RANDOMX
uv_mutex_t m_minerLock;
Miner* m_miner = nullptr; Miner* m_miner = nullptr;
#endif #endif

Loading…
Cancel
Save