@@ -29,6 +29,8 @@ use crate::io::{
2929} ;
3030use crate :: logger:: { log_debug, log_error, log_info, LdkLogger } ;
3131
32+ use crate :: runtime:: { Runtime , RuntimeError } ;
33+
3234use lightning:: events:: bump_transaction:: BumpTransactionEvent ;
3335use lightning:: events:: { ClosureReason , PaymentPurpose , ReplayEvent } ;
3436use lightning:: events:: { Event as LdkEvent , PaymentFailureReason } ;
@@ -53,7 +55,7 @@ use core::future::Future;
5355use core:: task:: { Poll , Waker } ;
5456use std:: collections:: VecDeque ;
5557use std:: ops:: Deref ;
56- use std:: sync:: { Arc , Condvar , Mutex , RwLock } ;
58+ use std:: sync:: { Arc , Condvar , Mutex } ;
5759use std:: time:: Duration ;
5860
5961/// An event emitted by [`Node`], which should be handled by the user.
@@ -451,7 +453,7 @@ where
451453 liquidity_source : Option < Arc < LiquiditySource < Arc < Logger > > > > ,
452454 payment_store : Arc < PaymentStore > ,
453455 peer_store : Arc < PeerStore < L > > ,
454- runtime : Arc < RwLock < Option < Arc < tokio :: runtime :: Runtime > > > > ,
456+ runtime : Arc < Runtime > ,
455457 logger : L ,
456458 config : Arc < Config > ,
457459}
@@ -466,8 +468,8 @@ where
466468 channel_manager : Arc < ChannelManager > , connection_manager : Arc < ConnectionManager < L > > ,
467469 output_sweeper : Arc < Sweeper > , network_graph : Arc < Graph > ,
468470 liquidity_source : Option < Arc < LiquiditySource < Arc < Logger > > > > ,
469- payment_store : Arc < PaymentStore > , peer_store : Arc < PeerStore < L > > ,
470- runtime : Arc < RwLock < Option < Arc < tokio :: runtime :: Runtime > > > > , logger : L , config : Arc < Config > ,
471+ payment_store : Arc < PaymentStore > , peer_store : Arc < PeerStore < L > > , runtime : Arc < Runtime > ,
472+ logger : L , config : Arc < Config > ,
471473 ) -> Self {
472474 Self {
473475 event_queue,
@@ -1049,16 +1051,16 @@ where
10491051 let forwarding_channel_manager = self . channel_manager . clone ( ) ;
10501052 let min = time_forwardable. as_millis ( ) as u64 ;
10511053
1052- let runtime_lock = self . runtime . read ( ) . unwrap ( ) ;
1053- debug_assert ! ( runtime_lock. is_some( ) ) ;
1054+ let future = async move {
1055+ let millis_to_sleep = thread_rng ( ) . gen_range ( min..min * 5 ) as u64 ;
1056+ tokio:: time:: sleep ( Duration :: from_millis ( millis_to_sleep) ) . await ;
10541057
1055- if let Some ( runtime) = runtime_lock. as_ref ( ) {
1056- runtime. spawn ( async move {
1057- let millis_to_sleep = thread_rng ( ) . gen_range ( min..min * 5 ) as u64 ;
1058- tokio:: time:: sleep ( Duration :: from_millis ( millis_to_sleep) ) . await ;
1058+ forwarding_channel_manager. process_pending_htlc_forwards ( ) ;
1059+ } ;
10591060
1060- forwarding_channel_manager. process_pending_htlc_forwards ( ) ;
1061- } ) ;
1061+ if let Err ( RuntimeError :: NotRunning ) = self . runtime . spawn ( future) {
1062+ log_error ! ( self . logger, "Tried spawing a future while the runtime wasn't available. This should never happen." ) ;
1063+ debug_assert ! ( false , "Tried spawing a future while the runtime wasn't available. This should never happen." ) ;
10621064 }
10631065 } ,
10641066 LdkEvent :: SpendableOutputs { outputs, channel_id } => {
@@ -1419,30 +1421,29 @@ where
14191421 debug_assert ! ( false , "We currently don't handle BOLT12 invoices manually, so this event should never be emitted." ) ;
14201422 } ,
14211423 LdkEvent :: ConnectionNeeded { node_id, addresses } => {
1422- let runtime_lock = self . runtime . read ( ) . unwrap ( ) ;
1423- debug_assert ! ( runtime_lock. is_some( ) ) ;
1424-
1425- if let Some ( runtime) = runtime_lock. as_ref ( ) {
1426- let spawn_logger = self . logger . clone ( ) ;
1427- let spawn_cm = Arc :: clone ( & self . connection_manager ) ;
1428- runtime. spawn ( async move {
1429- for addr in & addresses {
1430- match spawn_cm. connect_peer_if_necessary ( node_id, addr. clone ( ) ) . await {
1431- Ok ( ( ) ) => {
1432- return ;
1433- } ,
1434- Err ( e) => {
1435- log_error ! (
1436- spawn_logger,
1437- "Failed to establish connection to peer {}@{}: {}" ,
1438- node_id,
1439- addr,
1440- e
1441- ) ;
1442- } ,
1443- }
1424+ let spawn_logger = self . logger . clone ( ) ;
1425+ let spawn_cm = Arc :: clone ( & self . connection_manager ) ;
1426+ let future = async move {
1427+ for addr in & addresses {
1428+ match spawn_cm. connect_peer_if_necessary ( node_id, addr. clone ( ) ) . await {
1429+ Ok ( ( ) ) => {
1430+ return ;
1431+ } ,
1432+ Err ( e) => {
1433+ log_error ! (
1434+ spawn_logger,
1435+ "Failed to establish connection to peer {}@{}: {}" ,
1436+ node_id,
1437+ addr,
1438+ e
1439+ ) ;
1440+ } ,
14441441 }
1445- } ) ;
1442+ }
1443+ } ;
1444+ if let Err ( RuntimeError :: NotRunning ) = self . runtime . spawn ( future) {
1445+ log_error ! ( self . logger, "Tried spawing a future while the runtime wasn't available. This should never happen." ) ;
1446+ debug_assert ! ( false , "Tried spawing a future while the runtime wasn't available. This should never happen." ) ;
14461447 }
14471448 } ,
14481449 LdkEvent :: BumpTransaction ( bte) => {
0 commit comments