From 4646a4546e50c8d8f52825729acbd817d1f7ef9a Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Wed, 14 Oct 2020 14:21:02 -0400 Subject: [PATCH] Use a weak reference from channel reactor to channel. --- tor-proto/src/channel/reactor.rs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tor-proto/src/channel/reactor.rs b/tor-proto/src/channel/reactor.rs index 1aa3f4606..1c1814b3a 100644 --- a/tor-proto/src/channel/reactor.rs +++ b/tor-proto/src/channel/reactor.rs @@ -19,7 +19,7 @@ use futures::select_biased; use futures::sink::SinkExt; use futures::stream::{self, SplitStream, StreamExt}; -use std::sync::Arc; +use std::sync::{Arc, Weak}; use log::trace; @@ -79,7 +79,7 @@ struct ReactorCore { circs: Arc>, /// Channel pointer -- used to send DESTROY cells. - channel: Arc>, + channel: Weak>, } impl Reactor @@ -99,7 +99,7 @@ where input: SplitStream>, ) -> Self { let core = ReactorCore { - channel, + channel: Arc::downgrade(&channel), circs: circmap, }; @@ -292,8 +292,10 @@ impl ReactorCore { // TODO: use a constant for DESTROY_REASON_NONE. let destroy = Destroy::new(0).into(); let cell = ChanCell::new(id, destroy); - let mut chan = self.channel.lock().await; - chan.send_cell(cell).await?; + if let Some(chan) = self.channel.upgrade() { + let mut chan = chan.lock().await; + chan.send_cell(cell).await?; + } } Ok(())