mirror of https://github.com/SChernykh/p2pool
Fixed data races in miner
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…
Reference in New Issue