tor-proto: consolidate `Channel`s "closed" state handling
Previously Channel
had two concepts of "closed". There was an atomic flag that was set to true
at the end Reactor::run
, and an experimental oneshot channel where the sender was dropped when the reactor was dropped.
This MR consolidates these two using a new oneshot_broadcast
module, which combines a AtomicBool
with oneshot::{Receiver,Sender}
and futures::Shared
. (This could be done nicer with a completely custom channel type, but it feels overboard unless we need it.) This means that the behaviour is consistent between both "closed" statuses (is_closing()
and wait_for_close()
). A channel is considered closed when its reactor is dropped.
This also helps progress towards making the channel reactor cancellation safe (see #1756).
My goal is to later make Channel::wait_for_close
non-experimental so that I can use it in the channel manager to detect when the channel closes. Before doing this, I wanted to ensure that both Channel::is_closing
and Channel::wait_for_close
were consistent.