@@ -1623,6 +1623,36 @@ macro_rules! handle_new_monitor_update {
1623
1623
}
1624
1624
}
1625
1625
1626
+ macro_rules! process_events_body {
1627
+ ( $self: expr, $event_to_handle: expr, $handle_event: expr) => {
1628
+ // We'll acquire our total consistency lock until the returned future completes so that
1629
+ // we can be sure no other persists happen while processing events.
1630
+ let _read_guard = $self. total_consistency_lock. read( ) . unwrap( ) ;
1631
+
1632
+ let mut result = NotifyOption :: SkipPersist ;
1633
+
1634
+ // TODO: This behavior should be documented. It's unintuitive that we query
1635
+ // ChannelMonitors when clearing other events.
1636
+ if $self. process_pending_monitor_events( ) {
1637
+ result = NotifyOption :: DoPersist ;
1638
+ }
1639
+
1640
+ let pending_events = mem:: replace( & mut * $self. pending_events. lock( ) . unwrap( ) , vec![ ] ) ;
1641
+ if !pending_events. is_empty( ) {
1642
+ result = NotifyOption :: DoPersist ;
1643
+ }
1644
+
1645
+ for event in pending_events {
1646
+ $event_to_handle = event;
1647
+ $handle_event;
1648
+ }
1649
+
1650
+ if result == NotifyOption :: DoPersist {
1651
+ $self. persistence_notifier. notify( ) ;
1652
+ }
1653
+ }
1654
+ }
1655
+
1626
1656
impl < M : Deref , T : Deref , ES : Deref , NS : Deref , SP : Deref , F : Deref , R : Deref , L : Deref > ChannelManager < M , T , ES , NS , SP , F , R , L >
1627
1657
where
1628
1658
M :: Target : chain:: Watch < <SP :: Target as SignerProvider >:: Signer > ,
@@ -5720,30 +5750,8 @@ where
5720
5750
pub async fn process_pending_events_async < Future : core:: future:: Future , H : Fn ( Event ) -> Future > (
5721
5751
& self , handler : H
5722
5752
) {
5723
- // We'll acquire our total consistency lock until the returned future completes so that
5724
- // we can be sure no other persists happen while processing events.
5725
- let _read_guard = self . total_consistency_lock . read ( ) . unwrap ( ) ;
5726
-
5727
- let mut result = NotifyOption :: SkipPersist ;
5728
-
5729
- // TODO: This behavior should be documented. It's unintuitive that we query
5730
- // ChannelMonitors when clearing other events.
5731
- if self . process_pending_monitor_events ( ) {
5732
- result = NotifyOption :: DoPersist ;
5733
- }
5734
-
5735
- let pending_events = mem:: replace ( & mut * self . pending_events . lock ( ) . unwrap ( ) , vec ! [ ] ) ;
5736
- if !pending_events. is_empty ( ) {
5737
- result = NotifyOption :: DoPersist ;
5738
- }
5739
-
5740
- for event in pending_events {
5741
- handler ( event) . await ;
5742
- }
5743
-
5744
- if result == NotifyOption :: DoPersist {
5745
- self . persistence_notifier . notify ( ) ;
5746
- }
5753
+ let mut ev;
5754
+ process_events_body ! ( self , ev, { handler( ev) . await } ) ;
5747
5755
}
5748
5756
}
5749
5757
@@ -5825,26 +5833,8 @@ where
5825
5833
/// An [`EventHandler`] may safely call back to the provider in order to handle an event.
5826
5834
/// However, it must not call [`Writeable::write`] as doing so would result in a deadlock.
5827
5835
fn process_pending_events < H : Deref > ( & self , handler : H ) where H :: Target : EventHandler {
5828
- PersistenceNotifierGuard :: optionally_notify ( & self . total_consistency_lock , & self . persistence_notifier , || {
5829
- let mut result = NotifyOption :: SkipPersist ;
5830
-
5831
- // TODO: This behavior should be documented. It's unintuitive that we query
5832
- // ChannelMonitors when clearing other events.
5833
- if self . process_pending_monitor_events ( ) {
5834
- result = NotifyOption :: DoPersist ;
5835
- }
5836
-
5837
- let pending_events = mem:: replace ( & mut * self . pending_events . lock ( ) . unwrap ( ) , vec ! [ ] ) ;
5838
- if !pending_events. is_empty ( ) {
5839
- result = NotifyOption :: DoPersist ;
5840
- }
5841
-
5842
- for event in pending_events {
5843
- handler. handle_event ( event) ;
5844
- }
5845
-
5846
- result
5847
- } ) ;
5836
+ let mut ev;
5837
+ process_events_body ! ( self , ev, handler. handle_event( ev) ) ;
5848
5838
}
5849
5839
}
5850
5840
0 commit comments