diff options
author | Matt Corallo <git@bluematt.me> | 2017-06-08 11:13:46 -0400 |
---|---|---|
committer | Matt Corallo <git@bluematt.me> | 2017-10-13 19:29:54 -0400 |
commit | 0b2f42d7376c5f7c1ba1ac5d17a30691989d9159 (patch) | |
tree | 435de24bb4a2795e44c547bc4829dd1f9ddde1df /src/validationinterface.h | |
parent | 2b4b34503ff0ed44365d83a68ffed2736ea9cc51 (diff) |
Add CallFunctionInQueue to wait on validation interface queue drain
Diffstat (limited to 'src/validationinterface.h')
-rw-r--r-- | src/validationinterface.h | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/src/validationinterface.h b/src/validationinterface.h index 9b5784ccc3..1b231e5281 100644 --- a/src/validationinterface.h +++ b/src/validationinterface.h @@ -6,10 +6,11 @@ #ifndef BITCOIN_VALIDATIONINTERFACE_H #define BITCOIN_VALIDATIONINTERFACE_H -#include <memory> - #include "primitives/transaction.h" // CTransaction(Ref) +#include <functional> +#include <memory> + class CBlock; class CBlockIndex; struct CBlockLocator; @@ -31,6 +32,16 @@ void RegisterValidationInterface(CValidationInterface* pwalletIn); void UnregisterValidationInterface(CValidationInterface* pwalletIn); /** Unregister all wallets from core */ 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 { protected: @@ -86,6 +97,7 @@ private: friend void ::RegisterValidationInterface(CValidationInterface*); friend void ::UnregisterValidationInterface(CValidationInterface*); friend void ::UnregisterAllValidationInterfaces(); + friend void ::CallFunctionInValidationInterfaceQueue(std::function<void ()> func); void MempoolEntryRemoved(CTransactionRef tx, MemPoolRemovalReason reason); |