@@ -53,7 +53,7 @@ use crate::ln::msgs::{ChannelMessageHandler, DecodeError, LightningError, MAX_VA
53
53
use crate :: ln:: wire:: Encode ;
54
54
use crate :: chain:: keysinterface:: { Sign , KeysInterface , KeysManager , Recipient } ;
55
55
use crate :: util:: config:: { UserConfig , ChannelConfig } ;
56
- use crate :: util:: events:: { EventHandler , EventsProvider , MessageSendEvent , MessageSendEventsProvider , ClosureReason , HTLCDestination } ;
56
+ use crate :: util:: events:: { Event , EventHandler , EventsProvider , MessageSendEvent , MessageSendEventsProvider , ClosureReason , HTLCDestination } ;
57
57
use crate :: util:: { byte_utils, events} ;
58
58
use crate :: util:: wakers:: { Future , Notifier } ;
59
59
use crate :: util:: scid_utils:: fake_scid;
@@ -5728,6 +5728,39 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
5728
5728
pub fn clear_pending_payments ( & self ) {
5729
5729
self . pending_outbound_payments . lock ( ) . unwrap ( ) . clear ( )
5730
5730
}
5731
+
5732
+ /// Processes any events asynchronously in the order they were generated since the last call
5733
+ /// using the given event handler.
5734
+ ///
5735
+ /// See the trait-level documentation of [`EventsProvider`] for requirements.
5736
+ pub async fn process_pending_events_async < Future : core:: future:: Future , H : Fn ( Event ) -> Future > (
5737
+ & self , handler : H
5738
+ ) {
5739
+ // We'll acquire our total consistency lock until the returned future completes so that
5740
+ // we can be sure no other persists happen while processing events.
5741
+ let _read_guard = self . total_consistency_lock . read ( ) . unwrap ( ) ;
5742
+
5743
+ let mut result = NotifyOption :: SkipPersist ;
5744
+
5745
+ // TODO: This behavior should be documented. It's unintuitive that we query
5746
+ // ChannelMonitors when clearing other events.
5747
+ if self . process_pending_monitor_events ( ) {
5748
+ result = NotifyOption :: DoPersist ;
5749
+ }
5750
+
5751
+ let pending_events = mem:: replace ( & mut * self . pending_events . lock ( ) . unwrap ( ) , vec ! [ ] ) ;
5752
+ if !pending_events. is_empty ( ) {
5753
+ result = NotifyOption :: DoPersist ;
5754
+ }
5755
+
5756
+ for event in pending_events {
5757
+ handler ( event) . await ;
5758
+ }
5759
+
5760
+ if result == NotifyOption :: DoPersist {
5761
+ self . persistence_notifier . notify ( ) ;
5762
+ }
5763
+ }
5731
5764
}
5732
5765
5733
5766
impl < M : Deref , T : Deref , K : Deref , F : Deref , L : Deref > MessageSendEventsProvider for ChannelManager < M , T , K , F , L >
0 commit comments