@@ -37,6 +37,7 @@ use crate::events::{Event, EventHandler};
37
37
use crate :: util:: atomic_counter:: AtomicCounter ;
38
38
use crate :: util:: logger:: Logger ;
39
39
use crate :: util:: errors:: APIError ;
40
+ use crate :: util:: wakers:: { Future , Notifier } ;
40
41
use crate :: ln:: channelmanager:: ChannelDetails ;
41
42
42
43
use crate :: prelude:: * ;
@@ -240,6 +241,8 @@ pub struct ChainMonitor<ChannelSigner: WriteableEcdsaChannelSigner, C: Deref, T:
240
241
pending_monitor_events : Mutex < Vec < ( OutPoint , Vec < MonitorEvent > , Option < PublicKey > ) > > ,
241
242
/// The best block height seen, used as a proxy for the passage of time.
242
243
highest_chain_height : AtomicUsize ,
244
+
245
+ event_notifier : Notifier ,
243
246
}
244
247
245
248
impl < 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,
300
303
ChannelMonitorUpdateStatus :: PermanentFailure => {
301
304
monitor_state. channel_perm_failed . store ( true , Ordering :: Release ) ;
302
305
self . pending_monitor_events . lock ( ) . unwrap ( ) . push ( ( * funding_outpoint, vec ! [ MonitorEvent :: UpdateFailed ( * funding_outpoint) ] , monitor. get_counterparty_node_id ( ) ) ) ;
306
+ self . event_notifier . notify ( ) ;
303
307
} ,
304
308
ChannelMonitorUpdateStatus :: InProgress => {
305
309
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,
345
349
persister,
346
350
pending_monitor_events : Mutex :: new ( Vec :: new ( ) ) ,
347
351
highest_chain_height : AtomicUsize :: new ( 0 ) ,
352
+ event_notifier : Notifier :: new ( ) ,
348
353
}
349
354
}
350
355
@@ -472,6 +477,7 @@ where C::Target: chain::Filter,
472
477
}
473
478
} ,
474
479
}
480
+ self . event_notifier . notify ( ) ;
475
481
Ok ( ( ) )
476
482
}
477
483
@@ -486,6 +492,7 @@ where C::Target: chain::Filter,
486
492
funding_txo,
487
493
monitor_update_id,
488
494
} ] , counterparty_node_id) ) ;
495
+ self . event_notifier . notify ( ) ;
489
496
}
490
497
491
498
#[ cfg( any( test, fuzzing, feature = "_test_utils" ) ) ]
@@ -514,6 +521,18 @@ where C::Target: chain::Filter,
514
521
handler ( event) . await ;
515
522
}
516
523
}
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::events::EventsProvider::process_pending_events
533
+ pub fn get_update_future ( & self ) -> Future {
534
+ self . event_notifier . get_future ( )
535
+ }
517
536
}
518
537
519
538
impl < ChannelSigner : WriteableEcdsaChannelSigner , C : Deref , T : Deref , F : Deref , L : Deref , P : Deref >
0 commit comments