From 292e2580e5d3e75c266ee35c5ca0e97634f03ebd Mon Sep 17 00:00:00 2001 From: SChernykh Date: Thu, 24 Mar 2022 20:55:35 +0100 Subject: [PATCH] Make sure dataset init doesn't block start --- src/pow_hash.cpp | 10 +++++++++- src/pow_hash.h | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/pow_hash.cpp b/src/pow_hash.cpp index 4244a59..648267c 100644 --- a/src/pow_hash.cpp +++ b/src/pow_hash.cpp @@ -41,6 +41,7 @@ RandomX_Hasher::RandomX_Hasher(p2pool* pool) , m_seed{} , m_index(0) , m_seedCounter(0) + , m_oldSeedCounter(0) { uint64_t memory_allocated = 0; @@ -223,6 +224,11 @@ void RandomX_Hasher::set_seed(const hash& seed) numThreads /= 2; } + // wait for set_old_seed() before initializing dataset + while (m_oldSeedCounter.load() == 0) { + std::this_thread::yield(); + } + LOGINFO(1, log::LightCyan() << "running " << numThreads << " threads to update dataset"); ReadLock lock2(m_cacheLock); @@ -274,7 +280,7 @@ void RandomX_Hasher::set_old_seed(const hash& seed) { // set_seed() must go first, wait for it while (m_seedCounter.load() == 0) { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); + std::this_thread::yield(); } LOGINFO(1, "old seed " << log::LightBlue() << seed); @@ -282,6 +288,8 @@ void RandomX_Hasher::set_old_seed(const hash& seed) { WriteLock lock(m_cacheLock); + m_oldSeedCounter.fetch_add(1); + const uint32_t old_index = m_index ^ 1; m_seed[old_index] = seed; diff --git a/src/pow_hash.h b/src/pow_hash.h index 020ace7..7efcf71 100644 --- a/src/pow_hash.h +++ b/src/pow_hash.h @@ -90,6 +90,7 @@ private: uint32_t m_index; std::atomic m_seedCounter; + std::atomic m_oldSeedCounter; }; #endif