diff --git a/src/console_commands.cpp b/src/console_commands.cpp index ad80569..dee7dd5 100644 --- a/src/console_commands.cpp +++ b/src/console_commands.cpp @@ -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; diff --git a/src/miner.cpp b/src/miner.cpp index 7f42c5d..1580a97 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -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()); diff --git a/src/miner.h b/src/miner.h index 53df126..c979e1e 100644 --- a/src/miner.h +++ b/src/miner.h @@ -49,7 +49,7 @@ private: }; std::vector m_minerThreads; - volatile bool m_stopped; + std::atomic 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 m_jobIndex; void run(WorkerData* data); }; diff --git a/src/p2pool.cpp b/src/p2pool.cpp index d46dc0c..1520c53 100644 --- a/src/p2pool.cpp +++ b/src/p2pool.cpp @@ -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 diff --git a/src/p2pool.h b/src/p2pool.h index 7b0a7b3..fe05d8b 100644 --- a/src/p2pool.h +++ b/src/p2pool.h @@ -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 m_serversStarted{ 0 }; StratumServer* m_stratumServer = nullptr; P2PServer* m_p2pServer = nullptr; + #ifdef WITH_RANDOMX + uv_mutex_t m_minerLock; Miner* m_miner = nullptr; #endif