diff options
| author | Matt Corallo <[email protected]> | 2017-06-08 11:13:46 -0400 |
|---|---|---|
| committer | Matt Corallo <[email protected]> | 2017-10-13 19:29:54 -0400 |
| commit | 0b2f42d7376c5f7c1ba1ac5d17a30691989d9159 (patch) | |
| tree | 435de24bb4a2795e44c547bc4829dd1f9ddde1df /src/validationinterface.h | |
| parent | Add ability to assert a lock is not held in DEBUG_LOCKORDER (diff) | |
| download | discoin-0b2f42d7376c5f7c1ba1ac5d17a30691989d9159.tar.xz discoin-0b2f42d7376c5f7c1ba1ac5d17a30691989d9159.zip | |
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 9b5784ccc..1b231e528 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); |