@@ -37,6 +37,7 @@ use crate::events::{Event, EventHandler};
3737use crate :: util:: atomic_counter:: AtomicCounter ;
3838use crate :: util:: logger:: Logger ;
3939use crate :: util:: errors:: APIError ;
40+ use crate :: util:: wakers:: { Future , Notifier } ;
4041use crate :: ln:: channelmanager:: ChannelDetails ;
4142
4243use crate :: prelude:: * ;
@@ -240,6 +241,8 @@ pub struct ChainMonitor<ChannelSigner: WriteableEcdsaChannelSigner, C: Deref, T:
240241 pending_monitor_events : Mutex < Vec < ( OutPoint , Vec < MonitorEvent > , Option < PublicKey > ) > > ,
241242 /// The best block height seen, used as a proxy for the passage of time.
242243 highest_chain_height : AtomicUsize ,
244+
245+ persistence_notifier : Notifier ,
243246}
244247
245248impl < ChannelSigner : WriteableEcdsaChannelSigner , C : Deref , T : Deref , F : Deref , L : Deref , P : Deref > ChainMonitor < ChannelSigner , C , T , F , L , P >
@@ -300,6 +303,7 @@ where C::Target: chain::Filter,
300303 ChannelMonitorUpdateStatus :: PermanentFailure => {
301304 monitor_state. channel_perm_failed . store ( true , Ordering :: Release ) ;
302305 self . pending_monitor_events . lock ( ) . unwrap ( ) . push ( ( * funding_outpoint, vec ! [ MonitorEvent :: UpdateFailed ( * funding_outpoint) ] , monitor. get_counterparty_node_id ( ) ) ) ;
306+ self . persistence_notifier . notify ( ) ;
303307 } ,
304308 ChannelMonitorUpdateStatus :: InProgress => {
305309 log_debug ! ( self . logger, "Channel Monitor sync for channel {} in progress, holding events until completion!" , log_funding_info!( monitor) ) ;
@@ -345,6 +349,7 @@ where C::Target: chain::Filter,
345349 persister,
346350 pending_monitor_events : Mutex :: new ( Vec :: new ( ) ) ,
347351 highest_chain_height : AtomicUsize :: new ( 0 ) ,
352+ persistence_notifier : Notifier :: new ( ) ,
348353 }
349354 }
350355
@@ -472,6 +477,7 @@ where C::Target: chain::Filter,
472477 }
473478 } ,
474479 }
480+ self . persistence_notifier . notify ( ) ;
475481 Ok ( ( ) )
476482 }
477483
@@ -486,6 +492,7 @@ where C::Target: chain::Filter,
486492 funding_txo,
487493 monitor_update_id,
488494 } ] , counterparty_node_id) ) ;
495+ self . persistence_notifier . notify ( ) ;
489496 }
490497
491498 #[ cfg( any( test, fuzzing, feature = "_test_utils" ) ) ]
@@ -514,6 +521,18 @@ where C::Target: chain::Filter,
514521 handler ( event) . await ;
515522 }
516523 }
524+
525+ /// Gets a [`Future`] that completes when an event is available either via
526+ /// [`chain::Watch::release_pending_monitor_events`] or
527+ /// [`EventsProvider::process_pending_events`].
528+ ///
529+ /// Note that callbacks registered on the [`Future`] MUST NOT call back into this
530+ /// [`ChainMonitor`] and should instead register actions to be taken later.
531+ ///
532+ /// [`EventsProvider::process_pending_events`]: crate::util::events::EventsProvider::process_pending_events
533+ pub fn get_update_future ( & self ) -> Future {
534+ self . persistence_notifier . get_future ( )
535+ }
517536}
518537
519538impl < ChannelSigner : WriteableEcdsaChannelSigner , C : Deref , T : Deref , F : Deref , L : Deref , P : Deref >
0 commit comments