diff --git a/src/stratum_server.cpp b/src/stratum_server.cpp index 3743de5..d3a25be 100644 --- a/src/stratum_server.cpp +++ b/src/stratum_server.cpp @@ -70,6 +70,7 @@ StratumServer::StratumServer(p2pool* pool) m_hashrateData[0] = { seconds_since_epoch(), 0 }; + uv_mutex_init_checked(&m_resetShareCountersLock); uv_mutex_init_checked(&m_blobsQueueLock); uv_mutex_init_checked(&m_showWorkersLock); uv_mutex_init_checked(&m_rngLock); @@ -77,6 +78,9 @@ StratumServer::StratumServer(p2pool* pool) m_extraNonce = get_random32(); + uv_async_init_checked(&m_loop, &m_resetShareCountersAsync, on_reset_share_counters); + m_resetShareCountersAsync.data = this; + uv_async_init_checked(&m_loop, &m_blobsAsync, on_blobs_ready); m_blobsAsync.data = this; m_blobsQueue.reserve(2); @@ -101,6 +105,7 @@ StratumServer::~StratumServer() } } + uv_mutex_destroy(&m_resetShareCountersLock); uv_mutex_destroy(&m_blobsQueueLock); uv_mutex_destroy(&m_showWorkersLock); uv_mutex_destroy(&m_rngLock); @@ -608,6 +613,22 @@ void StratumServer::show_workers() void StratumServer::reset_share_counters() { + MutexLock lock(m_resetShareCountersLock); + + if (!uv_is_closing(reinterpret_cast(&m_resetShareCountersAsync))) { + uv_async_send(&m_resetShareCountersAsync); + } +} + +void StratumServer::on_reset_share_counters() +{ + check_event_loop_thread(__func__); + + for (StratumClient* c = static_cast(m_connectedClientsList->m_next); c != m_connectedClientsList; c = static_cast(c->m_next)) { + c->m_stratumShares = 0; + c->m_sidechainShares = 0; + } + WriteLock lock(m_hashrateDataLock); m_cumulativeHashesAtLastShare = m_cumulativeHashes; @@ -1171,6 +1192,10 @@ void StratumServer::on_after_share_found(uv_work_t* req, int /*status*/) void StratumServer::on_shutdown() { + { + MutexLock lock(m_resetShareCountersLock); + uv_close(reinterpret_cast(&m_resetShareCountersAsync), nullptr); + } { MutexLock lock(m_blobsQueueLock); uv_close(reinterpret_cast(&m_blobsAsync), nullptr); diff --git a/src/stratum_server.h b/src/stratum_server.h index 5c5dcd8..a4051cd 100644 --- a/src/stratum_server.h +++ b/src/stratum_server.h @@ -131,6 +131,12 @@ private: hash m_seedHash; }; + uv_mutex_t m_resetShareCountersLock; + uv_async_t m_resetShareCountersAsync; + + static void on_reset_share_counters(uv_async_t* handle) { reinterpret_cast(handle->data)->on_reset_share_counters(); } + void on_reset_share_counters(); + uv_mutex_t m_blobsQueueLock; uv_async_t m_blobsAsync; std::vector m_blobsQueue;