Add CallFunctionInQueue to wait on validation interface queue drain
This commit is contained in:
parent
2b4b34503f
commit
0b2f42d737
2 changed files with 18 additions and 2 deletions
|
@ -104,6 +104,10 @@ void UnregisterAllValidationInterfaces() {
|
||||||
g_signals.m_internals->NewPoWValidBlock.disconnect_all_slots();
|
g_signals.m_internals->NewPoWValidBlock.disconnect_all_slots();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CallFunctionInValidationInterfaceQueue(std::function<void ()> func) {
|
||||||
|
g_signals.m_internals->m_schedulerClient.AddToProcessQueue(std::move(func));
|
||||||
|
}
|
||||||
|
|
||||||
void CMainSignals::MempoolEntryRemoved(CTransactionRef ptx, MemPoolRemovalReason reason) {
|
void CMainSignals::MempoolEntryRemoved(CTransactionRef ptx, MemPoolRemovalReason reason) {
|
||||||
if (reason != MemPoolRemovalReason::BLOCK && reason != MemPoolRemovalReason::CONFLICT) {
|
if (reason != MemPoolRemovalReason::BLOCK && reason != MemPoolRemovalReason::CONFLICT) {
|
||||||
m_internals->m_schedulerClient.AddToProcessQueue([ptx, this] {
|
m_internals->m_schedulerClient.AddToProcessQueue([ptx, this] {
|
||||||
|
|
|
@ -6,10 +6,11 @@
|
||||||
#ifndef BITCOIN_VALIDATIONINTERFACE_H
|
#ifndef BITCOIN_VALIDATIONINTERFACE_H
|
||||||
#define BITCOIN_VALIDATIONINTERFACE_H
|
#define BITCOIN_VALIDATIONINTERFACE_H
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
|
|
||||||
#include "primitives/transaction.h" // CTransaction(Ref)
|
#include "primitives/transaction.h" // CTransaction(Ref)
|
||||||
|
|
||||||
|
#include <functional>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
class CBlock;
|
class CBlock;
|
||||||
class CBlockIndex;
|
class CBlockIndex;
|
||||||
struct CBlockLocator;
|
struct CBlockLocator;
|
||||||
|
@ -31,6 +32,16 @@ void RegisterValidationInterface(CValidationInterface* pwalletIn);
|
||||||
void UnregisterValidationInterface(CValidationInterface* pwalletIn);
|
void UnregisterValidationInterface(CValidationInterface* pwalletIn);
|
||||||
/** Unregister all wallets from core */
|
/** Unregister all wallets from core */
|
||||||
void UnregisterAllValidationInterfaces();
|
void UnregisterAllValidationInterfaces();
|
||||||
|
/**
|
||||||
|
* Pushes a function to callback onto the notification queue, guaranteeing any
|
||||||
|
* callbacks generated prior to now are finished when the function is called.
|
||||||
|
*
|
||||||
|
* Be very careful blocking on func to be called if any locks are held -
|
||||||
|
* validation interface clients may not be able to make progress as they often
|
||||||
|
* wait for things like cs_main, so blocking until func is called with cs_main
|
||||||
|
* will result in a deadlock (that DEBUG_LOCKORDER will miss).
|
||||||
|
*/
|
||||||
|
void CallFunctionInValidationInterfaceQueue(std::function<void ()> func);
|
||||||
|
|
||||||
class CValidationInterface {
|
class CValidationInterface {
|
||||||
protected:
|
protected:
|
||||||
|
@ -86,6 +97,7 @@ private:
|
||||||
friend void ::RegisterValidationInterface(CValidationInterface*);
|
friend void ::RegisterValidationInterface(CValidationInterface*);
|
||||||
friend void ::UnregisterValidationInterface(CValidationInterface*);
|
friend void ::UnregisterValidationInterface(CValidationInterface*);
|
||||||
friend void ::UnregisterAllValidationInterfaces();
|
friend void ::UnregisterAllValidationInterfaces();
|
||||||
|
friend void ::CallFunctionInValidationInterfaceQueue(std::function<void ()> func);
|
||||||
|
|
||||||
void MempoolEntryRemoved(CTransactionRef tx, MemPoolRemovalReason reason);
|
void MempoolEntryRemoved(CTransactionRef tx, MemPoolRemovalReason reason);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue