bool BlockchainSynchronizer::removeConsumer(IBlockchainConsumer* consumer) { assert(consumer != nullptr); if (!(checkIfStopped() && checkIfShouldStop())) { throw std::runtime_error("Can't remove consumer, because BlockchainSynchronizer isn't stopped"); } return m_consumers.erase(consumer) > 0; }
void BlockchainSynchronizer::addConsumer(IBlockchainConsumer* consumer) { assert(consumer != nullptr); assert(m_consumers.count(consumer) == 0); if (!(checkIfStopped() && checkIfShouldStop())) { throw std::runtime_error("Can't add consumer, because BlockchainSynchronizer isn't stopped"); } m_consumers.insert(std::make_pair(consumer, std::make_shared<SynchronizationState>(m_genesisBlockHash))); }
///pre: m_consumersMutex is locked SynchronizationState* BlockchainSynchronizer::getConsumerSynchronizationState(IBlockchainConsumer* consumer) const { assert(consumer != nullptr); if (!(checkIfStopped() && checkIfShouldStop())) { throw std::runtime_error("Can't get consumer state, because BlockchainSynchronizer isn't stopped"); } auto it = m_consumers.find(consumer); if (it == m_consumers.end()) { return nullptr; } return it->second.get(); }
IStreamSerializable* BlockchainSynchronizer::getConsumerState(IBlockchainConsumer* consumer) { assert(consumer != nullptr); if (!(checkIfStopped() && checkIfShouldStop())) { throw std::runtime_error("Can't get consumer state, because BlockchainSynchronizer isn't stopped"); } std::unique_lock<std::mutex> lk(m_consumersMutex); auto it = m_consumers.find(consumer); if (it == m_consumers.end()) { return nullptr; } return it->second.get(); }