Pass Event by reference to EventHandler

Passing an Event by reference rather and by move gives more flexibility
for composing event handlers without needing to clone events.
This commit is contained in:
Jeffrey Czyz 2021-08-17 11:12:18 -05:00
parent 423f1b1803
commit a6e650630d
No known key found for this signature in database
GPG key ID: 3A4E08275D5E96D2
5 changed files with 27 additions and 29 deletions

View file

@ -345,7 +345,7 @@ mod tests {
begin_open_channel!($node_a, $node_b, $channel_value); begin_open_channel!($node_a, $node_b, $channel_value);
let events = $node_a.node.get_and_clear_pending_events(); let events = $node_a.node.get_and_clear_pending_events();
assert_eq!(events.len(), 1); assert_eq!(events.len(), 1);
let (temporary_channel_id, tx) = handle_funding_generation_ready!(events[0], $channel_value); let (temporary_channel_id, tx) = handle_funding_generation_ready!(&events[0], $channel_value);
end_open_channel!($node_a, $node_b, temporary_channel_id, tx); end_open_channel!($node_a, $node_b, temporary_channel_id, tx);
tx tx
}} }}
@ -362,14 +362,14 @@ mod tests {
macro_rules! handle_funding_generation_ready { macro_rules! handle_funding_generation_ready {
($event: expr, $channel_value: expr) => {{ ($event: expr, $channel_value: expr) => {{
match $event { match $event {
Event::FundingGenerationReady { ref temporary_channel_id, ref channel_value_satoshis, ref output_script, user_channel_id } => { &Event::FundingGenerationReady { temporary_channel_id, channel_value_satoshis, ref output_script, user_channel_id } => {
assert_eq!(*channel_value_satoshis, $channel_value); assert_eq!(channel_value_satoshis, $channel_value);
assert_eq!(user_channel_id, 42); assert_eq!(user_channel_id, 42);
let tx = Transaction { version: 1 as i32, lock_time: 0, input: Vec::new(), output: vec![TxOut { let tx = Transaction { version: 1 as i32, lock_time: 0, input: Vec::new(), output: vec![TxOut {
value: *channel_value_satoshis, script_pubkey: output_script.clone(), value: channel_value_satoshis, script_pubkey: output_script.clone(),
}]}; }]};
(*temporary_channel_id, tx) (temporary_channel_id, tx)
}, },
_ => panic!("Unexpected event"), _ => panic!("Unexpected event"),
} }
@ -423,7 +423,7 @@ mod tests {
// Initiate the background processors to watch each node. // Initiate the background processors to watch each node.
let data_dir = nodes[0].persister.get_data_dir(); let data_dir = nodes[0].persister.get_data_dir();
let persister = move |node: &ChannelManager<InMemorySigner, Arc<ChainMonitor>, Arc<test_utils::TestBroadcaster>, Arc<KeysManager>, Arc<test_utils::TestFeeEstimator>, Arc<test_utils::TestLogger>>| FilesystemPersister::persist_manager(data_dir.clone(), node); let persister = move |node: &ChannelManager<InMemorySigner, Arc<ChainMonitor>, Arc<test_utils::TestBroadcaster>, Arc<KeysManager>, Arc<test_utils::TestFeeEstimator>, Arc<test_utils::TestLogger>>| FilesystemPersister::persist_manager(data_dir.clone(), node);
let event_handler = |_| {}; let event_handler = |_: &_| {};
let bg_processor = BackgroundProcessor::start(persister, event_handler, nodes[0].chain_monitor.clone(), nodes[0].node.clone(), nodes[0].peer_manager.clone(), nodes[0].logger.clone()); let bg_processor = BackgroundProcessor::start(persister, event_handler, nodes[0].chain_monitor.clone(), nodes[0].node.clone(), nodes[0].peer_manager.clone(), nodes[0].logger.clone());
macro_rules! check_persisted_data { macro_rules! check_persisted_data {
@ -476,7 +476,7 @@ mod tests {
let nodes = create_nodes(1, "test_timer_tick_called".to_string()); let nodes = create_nodes(1, "test_timer_tick_called".to_string());
let data_dir = nodes[0].persister.get_data_dir(); let data_dir = nodes[0].persister.get_data_dir();
let persister = move |node: &ChannelManager<InMemorySigner, Arc<ChainMonitor>, Arc<test_utils::TestBroadcaster>, Arc<KeysManager>, Arc<test_utils::TestFeeEstimator>, Arc<test_utils::TestLogger>>| FilesystemPersister::persist_manager(data_dir.clone(), node); let persister = move |node: &ChannelManager<InMemorySigner, Arc<ChainMonitor>, Arc<test_utils::TestBroadcaster>, Arc<KeysManager>, Arc<test_utils::TestFeeEstimator>, Arc<test_utils::TestLogger>>| FilesystemPersister::persist_manager(data_dir.clone(), node);
let event_handler = |_| {}; let event_handler = |_: &_| {};
let bg_processor = BackgroundProcessor::start(persister, event_handler, nodes[0].chain_monitor.clone(), nodes[0].node.clone(), nodes[0].peer_manager.clone(), nodes[0].logger.clone()); let bg_processor = BackgroundProcessor::start(persister, event_handler, nodes[0].chain_monitor.clone(), nodes[0].node.clone(), nodes[0].peer_manager.clone(), nodes[0].logger.clone());
loop { loop {
let log_entries = nodes[0].logger.lines.lock().unwrap(); let log_entries = nodes[0].logger.lines.lock().unwrap();
@ -498,7 +498,7 @@ mod tests {
open_channel!(nodes[0], nodes[1], 100000); open_channel!(nodes[0], nodes[1], 100000);
let persister = |_: &_| Err(std::io::Error::new(std::io::ErrorKind::Other, "test")); let persister = |_: &_| Err(std::io::Error::new(std::io::ErrorKind::Other, "test"));
let event_handler = |_| {}; let event_handler = |_: &_| {};
let bg_processor = BackgroundProcessor::start(persister, event_handler, nodes[0].chain_monitor.clone(), nodes[0].node.clone(), nodes[0].peer_manager.clone(), nodes[0].logger.clone()); let bg_processor = BackgroundProcessor::start(persister, event_handler, nodes[0].chain_monitor.clone(), nodes[0].node.clone(), nodes[0].peer_manager.clone(), nodes[0].logger.clone());
match bg_processor.join() { match bg_processor.join() {
Ok(_) => panic!("Expected error persisting manager"), Ok(_) => panic!("Expected error persisting manager"),
@ -518,7 +518,7 @@ mod tests {
// Set up a background event handler for FundingGenerationReady events. // Set up a background event handler for FundingGenerationReady events.
let (sender, receiver) = std::sync::mpsc::sync_channel(1); let (sender, receiver) = std::sync::mpsc::sync_channel(1);
let event_handler = move |event| { let event_handler = move |event: &Event| {
sender.send(handle_funding_generation_ready!(event, channel_value)).unwrap(); sender.send(handle_funding_generation_ready!(event, channel_value)).unwrap();
}; };
let bg_processor = BackgroundProcessor::start(persister.clone(), event_handler, nodes[0].chain_monitor.clone(), nodes[0].node.clone(), nodes[0].peer_manager.clone(), nodes[0].logger.clone()); let bg_processor = BackgroundProcessor::start(persister.clone(), event_handler, nodes[0].chain_monitor.clone(), nodes[0].node.clone(), nodes[0].peer_manager.clone(), nodes[0].logger.clone());
@ -544,7 +544,7 @@ mod tests {
// Set up a background event handler for SpendableOutputs events. // Set up a background event handler for SpendableOutputs events.
let (sender, receiver) = std::sync::mpsc::sync_channel(1); let (sender, receiver) = std::sync::mpsc::sync_channel(1);
let event_handler = move |event| sender.send(event).unwrap(); let event_handler = move |event: &Event| sender.send(event.clone()).unwrap();
let bg_processor = BackgroundProcessor::start(persister, event_handler, nodes[0].chain_monitor.clone(), nodes[0].node.clone(), nodes[0].peer_manager.clone(), nodes[0].logger.clone()); let bg_processor = BackgroundProcessor::start(persister, event_handler, nodes[0].chain_monitor.clone(), nodes[0].node.clone(), nodes[0].peer_manager.clone(), nodes[0].logger.clone());
// Force close the channel and check that the SpendableOutputs event was handled. // Force close the channel and check that the SpendableOutputs event was handled.

View file

@ -43,13 +43,12 @@
//! async fn connect_to_node(peer_manager: PeerManager, chain_monitor: Arc<ChainMonitor>, channel_manager: ChannelManager, their_node_id: PublicKey, addr: SocketAddr) { //! async fn connect_to_node(peer_manager: PeerManager, chain_monitor: Arc<ChainMonitor>, channel_manager: ChannelManager, their_node_id: PublicKey, addr: SocketAddr) {
//! lightning_net_tokio::connect_outbound(peer_manager, their_node_id, addr).await; //! lightning_net_tokio::connect_outbound(peer_manager, their_node_id, addr).await;
//! loop { //! loop {
//! let event_handler = |event: &Event| {
//! // Handle the event!
//! };
//! channel_manager.await_persistable_update(); //! channel_manager.await_persistable_update();
//! channel_manager.process_pending_events(&|event| { //! channel_manager.process_pending_events(&event_handler);
//! // Handle the event! //! chain_monitor.process_pending_events(&event_handler);
//! });
//! chain_monitor.process_pending_events(&|event| {
//! // Handle the event!
//! });
//! } //! }
//! } //! }
//! //!
@ -57,13 +56,12 @@
//! async fn accept_socket(peer_manager: PeerManager, chain_monitor: Arc<ChainMonitor>, channel_manager: ChannelManager, socket: TcpStream) { //! async fn accept_socket(peer_manager: PeerManager, chain_monitor: Arc<ChainMonitor>, channel_manager: ChannelManager, socket: TcpStream) {
//! lightning_net_tokio::setup_inbound(peer_manager, socket); //! lightning_net_tokio::setup_inbound(peer_manager, socket);
//! loop { //! loop {
//! let event_handler = |event: &Event| {
//! // Handle the event!
//! };
//! channel_manager.await_persistable_update(); //! channel_manager.await_persistable_update();
//! channel_manager.process_pending_events(&|event| { //! channel_manager.process_pending_events(&event_handler);
//! // Handle the event! //! chain_monitor.process_pending_events(&event_handler);
//! });
//! chain_monitor.process_pending_events(&|event| {
//! // Handle the event!
//! });
//! } //! }
//! } //! }
//! ``` //! ```

View file

@ -144,7 +144,7 @@ where C::Target: chain::Filter,
pub fn get_and_clear_pending_events(&self) -> Vec<events::Event> { pub fn get_and_clear_pending_events(&self) -> Vec<events::Event> {
use util::events::EventsProvider; use util::events::EventsProvider;
let events = core::cell::RefCell::new(Vec::new()); let events = core::cell::RefCell::new(Vec::new());
let event_handler = |event| events.borrow_mut().push(event); let event_handler = |event: &events::Event| events.borrow_mut().push(event.clone());
self.process_pending_events(&event_handler); self.process_pending_events(&event_handler);
events.into_inner() events.into_inner()
} }
@ -332,7 +332,7 @@ impl<ChannelSigner: Sign, C: Deref, T: Deref, F: Deref, L: Deref, P: Deref> even
pending_events.append(&mut monitor.get_and_clear_pending_events()); pending_events.append(&mut monitor.get_and_clear_pending_events());
} }
for event in pending_events.drain(..) { for event in pending_events.drain(..) {
handler.handle_event(event); handler.handle_event(&event);
} }
} }
} }

View file

@ -4167,7 +4167,7 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
#[cfg(any(test, feature = "fuzztarget", feature = "_test_utils"))] #[cfg(any(test, feature = "fuzztarget", feature = "_test_utils"))]
pub fn get_and_clear_pending_events(&self) -> Vec<events::Event> { pub fn get_and_clear_pending_events(&self) -> Vec<events::Event> {
let events = core::cell::RefCell::new(Vec::new()); let events = core::cell::RefCell::new(Vec::new());
let event_handler = |event| events.borrow_mut().push(event); let event_handler = |event: &events::Event| events.borrow_mut().push(event.clone());
self.process_pending_events(&event_handler); self.process_pending_events(&event_handler);
events.into_inner() events.into_inner()
} }
@ -4244,7 +4244,7 @@ where
} }
for event in pending_events.drain(..) { for event in pending_events.drain(..) {
handler.handle_event(event); handler.handle_event(&event);
} }
result result

View file

@ -561,11 +561,11 @@ pub trait EventHandler {
/// Handles the given [`Event`]. /// Handles the given [`Event`].
/// ///
/// See [`EventsProvider`] for details that must be considered when implementing this method. /// See [`EventsProvider`] for details that must be considered when implementing this method.
fn handle_event(&self, event: Event); fn handle_event(&self, event: &Event);
} }
impl<F> EventHandler for F where F: Fn(Event) { impl<F> EventHandler for F where F: Fn(&Event) {
fn handle_event(&self, event: Event) { fn handle_event(&self, event: &Event) {
self(event) self(event)
} }
} }