@@ -41,9 +41,7 @@ use std::ops::Deref;
4141/// for unilateral chain closure fees are at risk.
4242pub struct BackgroundProcessor {
4343 stop_thread : Arc < AtomicBool > ,
44- /// May be used to retrieve and handle the error if `BackgroundProcessor`'s thread
45- /// exits due to an error while persisting.
46- pub thread_handle : Option < JoinHandle < Result < ( ) , std:: io:: Error > > > ,
44+ thread_handle : Option < JoinHandle < Result < ( ) , std:: io:: Error > > > ,
4745}
4846
4947#[ cfg( not( test) ) ]
@@ -84,21 +82,25 @@ ChannelManagerPersister<Signer, M, T, K, F, L> for Fun where
8482}
8583
8684impl BackgroundProcessor {
87- /// Start a background thread that takes care of responsibilities enumerated in the top-level
88- /// documentation.
85+ /// Start a background thread that takes care of responsibilities enumerated in the [ top-level
86+ /// documentation] .
8987 ///
90- /// If `persist_manager` returns an error, then this thread will return said error (and
91- /// `start()` will need to be called again to restart the `BackgroundProcessor`). Users should
92- /// wait on [`thread_handle`]'s `join()` method to be able to tell if and when an error is
93- /// returned, or implement `persist_manager` such that an error is never returned to the
94- /// `BackgroundProcessor`
88+ /// The thread runs indefinitely unless the object is dropped, [`stop`] is called, or
89+ /// `persist_manager` returns an error. In case of an error, the error is retrieved by calling
90+ /// either [`join`] or [`stop`].
91+ ///
92+ /// Typically, users should either implement [`ChannelManagerPersister`] to never return an
93+ /// error or call [`join`] and handle any error that may arise. For the latter case, the
94+ /// `BackgroundProcessor` must be restarted by calling `start` again after handling the error.
9595 ///
9696 /// `persist_manager` is responsible for writing out the [`ChannelManager`] to disk, and/or
9797 /// uploading to one or more backup services. See [`ChannelManager::write`] for writing out a
9898 /// [`ChannelManager`]. See [`FilesystemPersister::persist_manager`] for Rust-Lightning's
9999 /// provided implementation.
100100 ///
101- /// [`thread_handle`]: BackgroundProcessor::thread_handle
101+ /// [top-level documentation]: Self
102+ /// [`join`]: Self::join
103+ /// [`stop`]: Self::stop
102104 /// [`ChannelManager`]: lightning::ln::channelmanager::ChannelManager
103105 /// [`ChannelManager::write`]: lightning::ln::channelmanager::ChannelManager#impl-Writeable
104106 /// [`FilesystemPersister::persist_manager`]: lightning_persister::FilesystemPersister::persist_manager
@@ -161,14 +163,40 @@ impl BackgroundProcessor {
161163 Self { stop_thread : stop_thread_clone, thread_handle : Some ( handle) }
162164 }
163165
164- /// Stop `BackgroundProcessor`'s thread.
166+ /// Join `BackgroundProcessor`'s thread, returning any error that occurred while persisting
167+ /// [`ChannelManager`].
168+ ///
169+ /// # Panics
170+ ///
171+ /// This function panics if the background thread has panicked such as while persisting or
172+ /// handling events.
173+ ///
174+ /// [`ChannelManager`]: lightning::ln::channelmanager::ChannelManager
175+ pub fn join ( mut self ) -> Result < ( ) , std:: io:: Error > {
176+ assert ! ( self . thread_handle. is_some( ) ) ;
177+ self . join_thread ( )
178+ }
179+
180+ /// Stop `BackgroundProcessor`'s thread, returning any error that occurred while persisting
181+ /// [`ChannelManager`].
182+ ///
183+ /// # Panics
184+ ///
185+ /// This function panics if the background thread has panicked such as while persisting or
186+ /// handling events.
187+ ///
188+ /// [`ChannelManager`]: lightning::ln::channelmanager::ChannelManager
165189 pub fn stop ( mut self ) -> Result < ( ) , std:: io:: Error > {
166190 assert ! ( self . thread_handle. is_some( ) ) ;
167191 self . stop_and_join_thread ( )
168192 }
169193
170194 fn stop_and_join_thread ( & mut self ) -> Result < ( ) , std:: io:: Error > {
171195 self . stop_thread . store ( true , Ordering :: Release ) ;
196+ self . join_thread ( )
197+ }
198+
199+ fn join_thread ( & mut self ) -> Result < ( ) , std:: io:: Error > {
172200 match self . thread_handle . take ( ) {
173201 Some ( handle) => handle. join ( ) . unwrap ( ) ,
174202 None => Ok ( ( ) ) ,
@@ -430,7 +458,7 @@ mod tests {
430458 let persister = |_: & _ | Err ( std:: io:: Error :: new ( std:: io:: ErrorKind :: Other , "test" ) ) ;
431459 let event_handler = |_| { } ;
432460 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 ( ) ) ;
433- match bg_processor. stop ( ) {
461+ match bg_processor. join ( ) {
434462 Ok ( _) => panic ! ( "Expected error persisting manager" ) ,
435463 Err ( e) => {
436464 assert_eq ! ( e. kind( ) , std:: io:: ErrorKind :: Other ) ;
0 commit comments