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();
}
#ifdef WITH_RANDOMX
if (m_pool->miner()) {
m_pool->miner()->print_status();
}
m_pool->print_miner_status();
#endif
bkg_jobs_tracker.print_status();
return 0;

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

@ -49,7 +49,7 @@ private:
};
std::vector<WorkerData*> m_minerThreads;
volatile bool m_stopped;
std::atomic<bool> m_stopped;
std::chrono::high_resolution_clock::time_point m_startTimestamp;
@ -75,7 +75,7 @@ private:
void set_nonce(uint32_t nonce, uint32_t extra_nonce);
};
Job m_job[2];
volatile uint32_t m_jobIndex;
std::atomic<uint32_t> m_jobIndex;
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_minerDataLock);
uv_mutex_init_checked(&m_foundBlocksLock);
#ifdef WITH_RANDOMX
uv_mutex_init_checked(&m_minerLock);
#endif
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);
@ -152,6 +155,9 @@ p2pool::~p2pool()
uv_rwlock_destroy(&m_mainchainLock);
uv_rwlock_destroy(&m_minerDataLock);
uv_mutex_destroy(&m_foundBlocksLock);
#ifdef WITH_RANDOMX
uv_mutex_destroy(&m_minerLock);
#endif
uv_mutex_destroy(&m_submitBlockDataLock);
delete m_api;
@ -189,6 +195,17 @@ bool p2pool::get_seed(uint64_t height, hash& seed) const
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)
{
if (!tx.weight || !tx.fee) {
@ -691,10 +708,15 @@ void p2pool::update_median_timestamp()
void p2pool::stratum_on_block()
{
#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
if (m_stratumServer) {
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)
{
stop_mining();
MutexLock lock(m_minerLock);
m_miner = new Miner(this, threads);
}
void p2pool::stop_mining()
{
Miner* miner = m_miner;
if (miner) {
MutexLock lock(m_minerLock);
if (m_miner) {
delete m_miner;
m_miner = nullptr;
delete miner;
}
}
#endif

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

Loading…
Cancel
Save