From d75948953097eb7278a521b83e6cd011634fd0c9 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Wed, 12 Oct 2022 10:11:43 -0400 Subject: [PATCH] Allow multiple ChannelBuilders to share a ChanMgrEventSender. --- crates/tor-chanmgr/src/builder.rs | 12 ++++++++---- crates/tor-chanmgr/src/lib.rs | 1 + 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/crates/tor-chanmgr/src/builder.rs b/crates/tor-chanmgr/src/builder.rs index ce00087fd..45442337d 100644 --- a/crates/tor-chanmgr/src/builder.rs +++ b/crates/tor-chanmgr/src/builder.rs @@ -36,7 +36,7 @@ where /// Asynchronous runtime for TLS, TCP, spawning, and timeouts. runtime: R, /// Used to update our bootstrap reporting status. - event_sender: Mutex, + event_sender: Arc>, /// The transport object that we use to construct streams. transport: H, /// Object to build TLS connections. @@ -48,12 +48,16 @@ where R: TlsProvider, { /// Construct a new ChanBuilder. - pub(crate) fn new(runtime: R, transport: H, event_sender: ChanMgrEventSender) -> Self { + pub(crate) fn new( + runtime: R, + transport: H, + event_sender: Arc>, + ) -> Self { let tls_connector = >::tls_connector(&runtime); ChanBuilder { runtime, transport, - event_sender: Mutex::new(event_sender), + event_sender, tls_connector, } } @@ -432,7 +436,7 @@ mod test { // Create the channel builder that we want to test. let (snd, _rcv) = crate::event::channel(); let transport = DefaultTransport::new(client_rt.clone()); - let builder = ChanBuilder::new(client_rt, transport, snd); + let builder = ChanBuilder::new(client_rt, transport, Arc::new(Mutex::new(snd))); let (r1, r2): (Result, Result) = futures::join!( async { diff --git a/crates/tor-chanmgr/src/lib.rs b/crates/tor-chanmgr/src/lib.rs index 131b4e484..b7bb60c1a 100644 --- a/crates/tor-chanmgr/src/lib.rs +++ b/crates/tor-chanmgr/src/lib.rs @@ -197,6 +197,7 @@ impl ChanMgr { R: 'static, { let (sender, receiver) = event::channel(); + let sender = Arc::new(std::sync::Mutex::new(sender)); let transport = builder::DefaultTransport::new(runtime.clone()); let builder = builder::ChanBuilder::new(runtime.clone(), transport, sender); let builder = builder::TimeoutChannelFactory::new(runtime, builder);