aboutsummaryrefslogtreecommitdiff
path: root/src/cryptonote_basic
diff options
context:
space:
mode:
authorRiccardo Spagni <ric@spagni.net>2019-04-11 13:03:32 +0200
committerRiccardo Spagni <ric@spagni.net>2019-04-11 13:03:32 +0200
commit38717dafc0e76fd5f939eb5ee76a278e2c74a752 (patch)
tree2cd88993400e0ae0e15d26417a831f6651b1d696 /src/cryptonote_basic
parentMerge pull request #5380 (diff)
parentminer: fix race when stopping mining with start mining enabled (diff)
downloadmonero-38717dafc0e76fd5f939eb5ee76a278e2c74a752.tar.xz
Merge pull request #5381
def40161 miner: fix race when stopping mining with start mining enabled (moneromooo-monero)
Diffstat (limited to 'src/cryptonote_basic')
-rw-r--r--src/cryptonote_basic/miner.cpp15
-rw-r--r--src/cryptonote_basic/miner.h1
2 files changed, 10 insertions, 6 deletions
diff --git a/src/cryptonote_basic/miner.cpp b/src/cryptonote_basic/miner.cpp
index f4e8d68a2..ded6e346f 100644
--- a/src/cryptonote_basic/miner.cpp
+++ b/src/cryptonote_basic/miner.cpp
@@ -106,6 +106,7 @@ namespace cryptonote
m_thread_index(0),
m_phandler(phandler),
m_height(0),
+ m_threads_active(0),
m_pausers_count(0),
m_threads_total(0),
m_starter_nonce(0),
@@ -264,8 +265,8 @@ namespace cryptonote
{
CRITICAL_REGION_LOCAL(m_threads_lock);
boost::interprocess::ipcdetail::atomic_write32(&m_stop, 1);
- for(boost::thread& th: m_threads)
- th.join();
+ while (m_threads_active > 0)
+ misc_utils::sleep_no_w(100);
m_threads.clear();
}
boost::interprocess::ipcdetail::atomic_write32(&m_stop, 0);
@@ -447,10 +448,11 @@ namespace cryptonote
// In case background mining was active and the miner threads are waiting
// on the background miner to signal start.
- m_is_background_mining_started_cond.notify_all();
-
- for(boost::thread& th: m_threads)
- th.join();
+ while (m_threads_active > 0)
+ {
+ m_is_background_mining_started_cond.notify_all();
+ misc_utils::sleep_no_w(100);
+ }
// The background mining thread could be sleeping for a long time, so we
// interrupt it just in case
@@ -590,6 +592,7 @@ namespace cryptonote
}
slow_hash_free_state();
MGINFO("Miner thread stopped ["<< th_local_index << "]");
+ --m_threads_active;
return true;
}
//-----------------------------------------------------------------------------------------------------
diff --git a/src/cryptonote_basic/miner.h b/src/cryptonote_basic/miner.h
index 08b1bd7f1..bbb576fff 100644
--- a/src/cryptonote_basic/miner.h
+++ b/src/cryptonote_basic/miner.h
@@ -125,6 +125,7 @@ namespace cryptonote
uint64_t m_height;
volatile uint32_t m_thread_index;
volatile uint32_t m_threads_total;
+ std::atomic<uint32_t> m_threads_active;
std::atomic<int32_t> m_pausers_count;
epee::critical_section m_miners_count_lock;