@@ -37,6 +37,7 @@ use crate::util::logger::Logger;
3737use  crate :: util:: errors:: APIError ; 
3838use  crate :: util:: events; 
3939use  crate :: util:: events:: { Event ,  EventHandler } ; 
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