Struct tor_circmgr::mgr::CircList
source · struct CircList<B: AbstractCircBuilder> {
open_circs: HashMap<<B::Circ as AbstractCirc>::Id, OpenEntry<B::Spec, B::Circ>>,
pending_circs: PtrWeakHashSet<Weak<PendingEntry<B>>>,
pending_requests: PtrWeakHashSet<Weak<PendingRequest<B>>>,
}
Expand description
The inner state of an AbstractCircMgr
.
Fields§
§open_circs: HashMap<<B::Circ as AbstractCirc>::Id, OpenEntry<B::Spec, B::Circ>>
A map from circuit ID to OpenEntry
values for all managed
open circuits.
A circuit is added here from AbstractCircMgr::do_launch
when we find
that it completes successfully, and has not been cancelled.
When we decide that such a circuit should no longer be handed out for
any new requests, we “retire” the circuit by removing it from this map.
pending_circs: PtrWeakHashSet<Weak<PendingEntry<B>>>
Weak-set of PendingEntry for circuits that are being built.
Because this set only holds weak references, and the only strong reference to the PendingEntry is held by the task building the circuit, this set’s members are lazily removed after the circuit is either built or fails to build.
This set is used for two purposes:
- When a circuit request finds that there is no open circuit for its purposes, it checks here to see if there is a pending circuit that it could wait for.
- When a pending circuit finishes building, it checks here to make sure that it has not been cancelled. (Removing an entry from this set marks it as cancelled.)
An entry is added here in AbstractCircMgr::prepare_action
when we
decide that a circuit needs to be launched.
Later, in AbstractCircMgr::do_launch
, once the circuit has finished
(or failed), we remove the entry (by pointer identity).
If we cannot find the entry, we conclude that the request has been
cancelled, and so we discard any circuit that was created.
pending_requests: PtrWeakHashSet<Weak<PendingRequest<B>>>
Weak-set of PendingRequest for requests that are waiting for a circuit to be built.
Because this set only holds weak references, and the only strong reference to the PendingRequest is held by the task waiting for the circuit to be built, this set’s members are lazily removed after the request succeeds or fails.
Implementations§
source§impl<B: AbstractCircBuilder> CircList<B>
impl<B: AbstractCircBuilder> CircList<B>
sourcefn find_open(
&mut self,
usage: &<B::Spec as AbstractSpec>::Usage
) -> Option<Vec<&mut OpenEntry<B::Spec, B::Circ>>>
fn find_open( &mut self, usage: &<B::Spec as AbstractSpec>::Usage ) -> Option<Vec<&mut OpenEntry<B::Spec, B::Circ>>>
Find all the usable open circuits that support usage
.
Return None if there are no such circuits.
sourcefn get_open_mut(
&mut self,
id: &<B::Circ as AbstractCirc>::Id
) -> Option<&mut OpenEntry<B::Spec, B::Circ>>
fn get_open_mut( &mut self, id: &<B::Circ as AbstractCirc>::Id ) -> Option<&mut OpenEntry<B::Spec, B::Circ>>
Find an open circuit by ID.
Return None if no such circuit exists in this list.
sourcefn take_open(
&mut self,
id: &<B::Circ as AbstractCirc>::Id
) -> Option<OpenEntry<B::Spec, B::Circ>>
fn take_open( &mut self, id: &<B::Circ as AbstractCirc>::Id ) -> Option<OpenEntry<B::Spec, B::Circ>>
Extract an open circuit by ID, removing it from this list.
Return None if no such circuit exists in this list.
sourcefn expire_circs(&mut self, unused_cutoff: Instant, dirty_cutoff: Instant)
fn expire_circs(&mut self, unused_cutoff: Instant, dirty_cutoff: Instant)
Remove circuits based on expiration times.
We remove every unused circuit that is set to expire by
unused_cutoff
, and every dirty circuit that has been dirty
since before dirty_cutoff
.
sourcefn expire_circ(
&mut self,
id: &<B::Circ as AbstractCirc>::Id,
unused_cutoff: Instant,
dirty_cutoff: Instant
)
fn expire_circ( &mut self, id: &<B::Circ as AbstractCirc>::Id, unused_cutoff: Instant, dirty_cutoff: Instant )
Remove the circuit with given id
, if it is scheduled to
expire now, according to the provided expiration times.
sourcefn add_pending_circ(&mut self, pending: Arc<PendingEntry<B>>)
fn add_pending_circ(&mut self, pending: Arc<PendingEntry<B>>)
Add pending
to the set of in-progress circuits.
sourcefn find_pending_circs(
&self,
usage: &<B::Spec as AbstractSpec>::Usage
) -> Option<Vec<Arc<PendingEntry<B>>>>
fn find_pending_circs( &self, usage: &<B::Spec as AbstractSpec>::Usage ) -> Option<Vec<Arc<PendingEntry<B>>>>
Find all pending circuits that support usage
.
If no such circuits are currently being built, return None.
sourcefn circ_is_pending(&self, circ: &Arc<PendingEntry<B>>) -> bool
fn circ_is_pending(&self, circ: &Arc<PendingEntry<B>>) -> bool
Return true if circ
is still pending.
A circuit will become non-pending when finishes (successfully or not), or when it’s
removed from this list via clear_all_circuits()
.
sourcefn add_pending_request(&mut self, pending: &Arc<PendingRequest<B>>)
fn add_pending_request(&mut self, pending: &Arc<PendingRequest<B>>)
Construct and add a new entry to the set of request waiting for a circuit.
Return the request, and a new receiver stream that it should use for notification of possible circuits to use.
sourcefn find_pending_requests(
&self,
circ_spec: &B::Spec
) -> Vec<Arc<PendingRequest<B>>>
fn find_pending_requests( &self, circ_spec: &B::Spec ) -> Vec<Arc<PendingRequest<B>>>
Return all pending requests that would be satisfied by a circuit
that supports circ_spec
.
sourcefn clear_all_circuits(&mut self)
fn clear_all_circuits(&mut self)
Clear all pending circuits and open circuits.
Calling clear_all_circuits
ensures that any request that is answered after
this method runs will receive a circuit that was launched after this
method runs.
Auto Trait Implementations§
impl<B> Freeze for CircList<B>
impl<B> !RefUnwindSafe for CircList<B>
impl<B> Send for CircList<B>
impl<B> Sync for CircList<B>
impl<B> Unpin for CircList<B>where
<<B as AbstractCircBuilder>::Circ as AbstractCirc>::Id: Unpin,
<B as AbstractCircBuilder>::Spec: Unpin,
impl<B> !UnwindSafe for CircList<B>
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.§impl<T> DowncastSync for T
impl<T> DowncastSync for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self
, then passes self.as_ref()
into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self
, then passes self.as_mut()
into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow()
only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref()
only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.