Changeset View
Changeset View
Standalone View
Standalone View
src/validationinterface.cpp
// Copyright (c) 2009-2010 Satoshi Nakamoto | // Copyright (c) 2009-2010 Satoshi Nakamoto | ||||
// Copyright (c) 2009-2016 The Bitcoin Core developers | // Copyright (c) 2009-2016 The Bitcoin Core developers | ||||
// Distributed under the MIT software license, see the accompanying | // Distributed under the MIT software license, see the accompanying | ||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php. | // file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||||
#include "validationinterface.h" | #include "validationinterface.h" | ||||
#include "init.h" | #include "init.h" | ||||
#include "scheduler.h" | #include "scheduler.h" | ||||
#include "sync.h" | #include "sync.h" | ||||
#include "txmempool.h" | #include "txmempool.h" | ||||
#include "util.h" | #include "util.h" | ||||
#include "validation.h" | |||||
#include <atomic> | #include <atomic> | ||||
#include <future> | |||||
#include <list> | #include <list> | ||||
#include <boost/signals2/signal.hpp> | #include <boost/signals2/signal.hpp> | ||||
struct MainSignalsInstance { | struct MainSignalsInstance { | ||||
boost::signals2::signal<void(const CBlockIndex *, const CBlockIndex *, | boost::signals2::signal<void(const CBlockIndex *, const CBlockIndex *, | ||||
bool fInitialDownload)> | bool fInitialDownload)> | ||||
UpdatedBlockTip; | UpdatedBlockTip; | ||||
▲ Show 20 Lines • Show All 125 Lines • ▼ Show 20 Lines | void UnregisterAllValidationInterfaces() { | ||||
g_signals.m_internals->UpdatedBlockTip.disconnect_all_slots(); | g_signals.m_internals->UpdatedBlockTip.disconnect_all_slots(); | ||||
g_signals.m_internals->NewPoWValidBlock.disconnect_all_slots(); | g_signals.m_internals->NewPoWValidBlock.disconnect_all_slots(); | ||||
} | } | ||||
void CallFunctionInValidationInterfaceQueue(std::function<void()> func) { | void CallFunctionInValidationInterfaceQueue(std::function<void()> func) { | ||||
g_signals.m_internals->m_schedulerClient.AddToProcessQueue(std::move(func)); | g_signals.m_internals->m_schedulerClient.AddToProcessQueue(std::move(func)); | ||||
} | } | ||||
void SyncWithValidationInterfaceQueue() { | |||||
AssertLockNotHeld(cs_main); | |||||
// Block until the validation queue drains | |||||
std::promise<void> promise; | |||||
CallFunctionInValidationInterfaceQueue([&promise] { promise.set_value(); }); | |||||
promise.get_future().wait(); | |||||
} | |||||
void CMainSignals::MempoolEntryRemoved(CTransactionRef ptx, | void CMainSignals::MempoolEntryRemoved(CTransactionRef ptx, | ||||
MemPoolRemovalReason reason) { | MemPoolRemovalReason reason) { | ||||
if (reason != MemPoolRemovalReason::BLOCK && | if (reason != MemPoolRemovalReason::BLOCK && | ||||
reason != MemPoolRemovalReason::CONFLICT) { | reason != MemPoolRemovalReason::CONFLICT) { | ||||
m_internals->m_schedulerClient.AddToProcessQueue( | m_internals->m_schedulerClient.AddToProcessQueue( | ||||
[ptx, this] { m_internals->TransactionRemovedFromMempool(ptx); }); | [ptx, this] { m_internals->TransactionRemovedFromMempool(ptx); }); | ||||
} | } | ||||
} | } | ||||
▲ Show 20 Lines • Show All 43 Lines • Show Last 20 Lines |