void BlockchainSynchronizer::actualizeFutureState() { std::unique_lock<std::mutex> lk(m_stateMutex); if (m_currentState == State::stopped && m_futureState == State::blockchainSync) { // start(), immideately attach observer m_node.addObserver(this); } if (m_futureState == State::stopped && m_currentState != State::stopped) { // stop(), immideately detach observer m_node.removeObserver(this); } m_currentState = m_futureState; switch (m_futureState) { case State::stopped: m_futureState = State::stopped; break; case State::blockchainSync: m_futureState = State::poolSync; lk.unlock(); startBlockchainSync(); break; case State::poolSync: m_futureState = State::idle; lk.unlock(); startPoolSync(); break; case State::idle: m_futureState = State::idle; lk.unlock(); std::this_thread::sleep_for(std::chrono::milliseconds(200)); break; default: break; } }
void BlockchainSynchronizer::actualizeFutureState() { std::unique_lock<std::mutex> lk(m_stateMutex); if (m_currentState == State::stopped && m_futureState == State::blockchainSync) { // start(), immideately attach observer m_node.addObserver(this); } if (m_futureState == State::stopped && m_currentState != State::stopped) { // stop(), immideately detach observer m_node.removeObserver(this); } while (!m_removeTransactionTasks.empty()) { auto& task = m_removeTransactionTasks.front(); const Crypto::Hash& transactionHash = *task.first; auto detachedPromise = std::move(task.second); m_removeTransactionTasks.pop_front(); try { doRemoveUnconfirmedTransaction(transactionHash); detachedPromise.set_value(); } catch (...) { detachedPromise.set_exception(std::current_exception()); } } while (!m_addTransactionTasks.empty()) { auto& task = m_addTransactionTasks.front(); const ITransactionReader& transaction = *task.first; auto detachedPromise = std::move(task.second); m_addTransactionTasks.pop_front(); try { auto ec = doAddUnconfirmedTransaction(transaction); detachedPromise.set_value(ec); } catch (...) { detachedPromise.set_exception(std::current_exception()); } } m_currentState = m_futureState; switch (m_futureState) { case State::stopped: break; case State::blockchainSync: m_futureState = State::poolSync; lk.unlock(); startBlockchainSync(); break; case State::poolSync: m_futureState = State::idle; lk.unlock(); startPoolSync(); break; case State::idle: m_hasWork.wait(lk, [this] { return m_futureState != State::idle || !m_removeTransactionTasks.empty() || !m_addTransactionTasks.empty(); }); lk.unlock(); break; default: break; } }