]> git.bitcoin.ninja Git - rust-lightning/commitdiff
Guard get_and_clear_pending_msg_events
authorJeffrey Czyz <jkczyz@gmail.com>
Wed, 19 May 2021 19:26:55 +0000 (12:26 -0700)
committerJeffrey Czyz <jkczyz@gmail.com>
Mon, 24 May 2021 21:19:56 +0000 (14:19 -0700)
lightning/src/ln/channelmanager.rs

index 592ab2b6c0ef7628b593a07b76236f8a3dfe8819..e39a778bc65722dc3e3fc176546552464922f54a 100644 (file)
@@ -62,6 +62,7 @@ use util::logger::Logger;
 use util::errors::APIError;
 
 use core::{cmp, mem};
+use std::cell::RefCell;
 use std::collections::{HashMap, hash_map, HashSet};
 use std::io::{Cursor, Read};
 use std::sync::{Arc, Condvar, Mutex, MutexGuard, RwLock, RwLockReadGuard};
@@ -3692,16 +3693,29 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> MessageSend
                                L::Target: Logger,
 {
        fn get_and_clear_pending_msg_events(&self) -> Vec<MessageSendEvent> {
-               //TODO: This behavior should be documented. It's non-intuitive that we query
-               // ChannelMonitors when clearing other events.
-               self.process_pending_monitor_events();
+               let events = RefCell::new(Vec::new());
+               PersistenceNotifierGuard::optionally_notify(&self.total_consistency_lock, &self.persistence_notifier, || {
+                       let mut result = NotifyOption::SkipPersist;
 
-               self.check_free_holding_cells();
+                       // TODO: This behavior should be documented. It's unintuitive that we query
+                       // ChannelMonitors when clearing other events.
+                       if self.process_pending_monitor_events() {
+                               result = NotifyOption::DoPersist;
+                       }
 
-               let mut ret = Vec::new();
-               let mut channel_state = self.channel_state.lock().unwrap();
-               mem::swap(&mut ret, &mut channel_state.pending_msg_events);
-               ret
+                       self.check_free_holding_cells();
+
+                       let mut pending_events = Vec::new();
+                       let mut channel_state = self.channel_state.lock().unwrap();
+                       mem::swap(&mut pending_events, &mut channel_state.pending_msg_events);
+
+                       if !pending_events.is_empty() {
+                               events.replace(pending_events);
+                       }
+
+                       result
+               });
+               events.into_inner()
        }
 }