@@ -10,7 +10,7 @@ use std::convert::TryInto;
1010use std:: default:: Default ;
1111use std:: net:: ToSocketAddrs ;
1212use std:: path:: PathBuf ;
13- use std:: sync:: { Arc , Mutex , Once , RwLock , Weak } ;
13+ use std:: sync:: { Arc , Mutex , Once , RwLock } ;
1414use std:: time:: SystemTime ;
1515use std:: { fmt, fs} ;
1616
@@ -1735,15 +1735,8 @@ fn build_with_store_internal(
17351735 } ) ?;
17361736 }
17371737
1738- // This hook resolves a circular dependency:
1739- // 1. PeerManager requires OnionMessenger (via MessageHandler).
1740- // 2. OnionMessenger (via HRN resolver) needs to call PeerManager::process_events.
1741- //
1742- // We provide the resolver with a Weak pointer via this Mutex-protected "hook."
1743- // This allows us to initialize the resolver before the PeerManager exists,
1744- // and prevents a reference cycle (memory leak).
1745- let peer_manager_hook: Arc < Mutex < Option < Weak < PeerManager > > > > = Arc :: new ( Mutex :: new ( None ) ) ;
17461738 let hrn_resolver;
1739+ let mut blip32_resolver = None ;
17471740
17481741 let runtime_handle = runtime. handle ( ) ;
17491742
@@ -1755,24 +1748,16 @@ fn build_with_store_internal(
17551748 let hrn_res =
17561749 Arc :: new ( LDKOnionMessageDNSSECHrnResolver :: new ( Arc :: clone ( & network_graph) ) ) ;
17571750 hrn_resolver = HRNResolver :: Onion ( Arc :: clone ( & hrn_res) ) ;
1751+ blip32_resolver = Some ( Arc :: clone ( & hrn_res) ) ;
17581752
1759- // We clone the hook because it's moved into a Send + Sync closure that outlives this scope.
1760- let pm_hook_clone = Arc :: clone ( & peer_manager_hook) ;
1761- hrn_res. register_post_queue_action ( Box :: new ( move || {
1762- if let Ok ( guard) = pm_hook_clone. lock ( ) {
1763- if let Some ( pm) = guard. as_ref ( ) . and_then ( |weak| weak. upgrade ( ) ) {
1764- pm. process_events ( ) ;
1765- }
1766- }
1767- } ) ) ;
17681753 hrn_res as Arc < dyn DNSResolverMessageHandler + Send + Sync >
17691754 } ,
17701755 HRNResolverConfig :: Dns { dns_server_address, enable_hrn_resolution_service, .. } => {
17711756 let addr = dns_server_address
17721757 . to_socket_addrs ( )
17731758 . map_err ( |_| BuildError :: DNSResolverSetupFailed ) ?
17741759 . next ( )
1775- . ok_or ( {
1760+ . ok_or_else ( || {
17761761 log_error ! ( logger, "No valid address found for: {}" , dns_server_address) ;
17771762 BuildError :: DNSResolverSetupFailed
17781763 } ) ?;
@@ -1945,8 +1930,13 @@ fn build_with_store_internal(
19451930 Arc :: clone ( & keys_manager) ,
19461931 ) ) ;
19471932
1948- if let Ok ( mut guard) = peer_manager_hook. lock ( ) {
1949- * guard = Some ( Arc :: downgrade ( & peer_manager) ) ;
1933+ if let Some ( res) = blip32_resolver {
1934+ let pm_weak = Arc :: downgrade ( & peer_manager) ;
1935+ res. register_post_queue_action ( Box :: new ( move || {
1936+ if let Some ( upgraded_pm) = pm_weak. upgrade ( ) {
1937+ upgraded_pm. process_events ( ) ;
1938+ }
1939+ } ) ) ;
19501940 }
19511941
19521942 liquidity_source. as_ref ( ) . map ( |l| l. set_peer_manager ( Arc :: downgrade ( & peer_manager) ) ) ;
@@ -2061,7 +2051,7 @@ fn build_with_store_internal(
20612051 node_metrics,
20622052 om_mailbox,
20632053 async_payments_role,
2064- hrn_resolver : Arc :: new ( hrn_resolver ) ,
2054+ hrn_resolver,
20652055 #[ cfg( cycle_tests) ]
20662056 _leak_checker,
20672057 } )
0 commit comments