mirror of
https://github.com/SChernykh/p2pool.git
synced 2025-03-12 09:29:51 +00:00
Fixed data races in miner
This commit is contained in:
parent
21d8cb917b
commit
2a77695832
5 changed files with 39 additions and 13 deletions
|
@ -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…
Reference in a new issue