Skip to content

tor-proto: consolidate `Channel`s "closed" state handling

opara requested to merge opara/arti:chanmgr-dos into main

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.

Edit: The oneshot_broadcast module was rewritten in later commits to use a OnceLock and Mutex instead.

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.

Edited by opara

Merge request reports

Loading