struct TunnelList<B: AbstractTunnelBuilder<R>, R: Runtime> {
open_tunnels: HashMap<<B::Tunnel as AbstractTunnel>::Id, OpenEntry<B::Tunnel>>,
pending_tunnels: PtrWeakHashSet<Weak<PendingEntry<B, R>>, RandomState>,
pending_requests: PtrWeakHashSet<Weak<PendingRequest<B, R>>, RandomState>,
}Expand description
The inner state of an AbstractTunnelMgr.
Fields§
§open_tunnels: HashMap<<B::Tunnel as AbstractTunnel>::Id, OpenEntry<B::Tunnel>>A map from tunnel ID to OpenEntry values for all managed
open tunnels.
A tunnel is added here from AbstractTunnelMgr::do_launch when we find
that it completes successfully, and has not been cancelled.
When we decide that such a tunnel should no longer be handed out for
any new requests, we “retire” the tunnel by removing it from this map.
pending_tunnels: PtrWeakHashSet<Weak<PendingEntry<B, R>>, RandomState>Weak-set of PendingEntry for tunnels 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 tunnel, this set’s members are lazily removed after the tunnel is either built or fails to build.
This set is used for two purposes:
- When a tunnel request finds that there is no open tunnel for its purposes, it checks here to see if there is a pending tunnel that it could wait for.
- When a pending tunnel 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 AbstractTunnelMgr::prepare_action when we
decide that a tunnel needs to be launched.
Later, in AbstractTunnelMgr::do_launch, once the tunnel 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 tunnel that was created.
pending_requests: PtrWeakHashSet<Weak<PendingRequest<B, R>>, RandomState>Weak-set of PendingRequest for requests that are waiting for a tunnel 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 tunnel to be built, this set’s members are lazily removed after the request succeeds or fails.
Implementations§
Source§impl<B: AbstractTunnelBuilder<R>, R: Runtime> TunnelList<B, R>
impl<B: AbstractTunnelBuilder<R>, R: Runtime> TunnelList<B, R>
Sourcefn find_open(
&mut self,
usage: &TargetTunnelUsage,
) -> Option<Vec<&mut OpenEntry<B::Tunnel>>>
fn find_open( &mut self, usage: &TargetTunnelUsage, ) -> Option<Vec<&mut OpenEntry<B::Tunnel>>>
Find all the usable open tunnels that support usage.
Return None if there are no such tunnels.
Sourcefn get_open_mut(
&mut self,
id: &<B::Tunnel as AbstractTunnel>::Id,
) -> Option<&mut OpenEntry<B::Tunnel>>
fn get_open_mut( &mut self, id: &<B::Tunnel as AbstractTunnel>::Id, ) -> Option<&mut OpenEntry<B::Tunnel>>
Find an open tunnel by ID.
Return None if no such tunnels exists in this list.
Sourcefn take_open(
&mut self,
id: &<B::Tunnel as AbstractTunnel>::Id,
) -> Option<OpenEntry<B::Tunnel>>
fn take_open( &mut self, id: &<B::Tunnel as AbstractTunnel>::Id, ) -> Option<OpenEntry<B::Tunnel>>
Extract an open tunnel by ID, removing it from this list.
Return None if no such tunnel exists in this list.
Sourcefn expire_tunnels(
&mut self,
now: Instant,
params: &ExpirationParameters,
) -> (Option<Instant>, Vec<Weak<B::Tunnel>>)
fn expire_tunnels( &mut self, now: Instant, params: &ExpirationParameters, ) -> (Option<Instant>, Vec<Weak<B::Tunnel>>)
Remove tunnels based on expiration times.
We remove every unused tunnel that is set to expire by
unused_cutoff, and every dirty tunnel that has been dirty
since before dirty_cutoff.
Return the next time at which anything will definitely expire, and a list of long-lived tunnels where we need to check their usage status before we can be sure if they are expired.
Sourcefn tunnel_should_expire(
&mut self,
id: &<B::Tunnel as AbstractTunnel>::Id,
now: Instant,
params: &ExpirationParameters,
) -> Option<ShouldExpire>
fn tunnel_should_expire( &mut self, id: &<B::Tunnel as AbstractTunnel>::Id, now: Instant, params: &ExpirationParameters, ) -> Option<ShouldExpire>
Return the time when the tunnel with given id, should expire.
Return None if no such tunnel exists.
Sourcefn update_long_lived_tunnel_last_used(
&mut self,
id: &<B::Tunnel as AbstractTunnel>::Id,
now: Instant,
params: &ExpirationParameters,
disused_since: &Result<Option<Instant>>,
) -> Result<Option<Instant>>
fn update_long_lived_tunnel_last_used( &mut self, id: &<B::Tunnel as AbstractTunnel>::Id, now: Instant, params: &ExpirationParameters, disused_since: &Result<Option<Instant>>, ) -> Result<Option<Instant>>
Update the “last known to be in use” time of a long-lived tunnel with ID id,
based on learning when it was last used.
Expire the tunnel if appropriate.
If the tunnel is still part of the map, return the next instant at which it might expire.
Returns an error if the tunnel was present but was not already marked as long-lived.
Sourcefn add_pending_tunnel(&mut self, pending: Arc<PendingEntry<B, R>>)
fn add_pending_tunnel(&mut self, pending: Arc<PendingEntry<B, R>>)
Add pending to the set of in-progress tunnels.
Sourcefn find_pending_tunnels(
&self,
usage: &TargetTunnelUsage,
) -> Option<Vec<Arc<PendingEntry<B, R>>>>
fn find_pending_tunnels( &self, usage: &TargetTunnelUsage, ) -> Option<Vec<Arc<PendingEntry<B, R>>>>
Find all pending tunnels that support usage.
If no such tunnels are currently being built, return None.
Sourcefn tunnel_is_pending(&self, circ: &Arc<PendingEntry<B, R>>) -> bool
fn tunnel_is_pending(&self, circ: &Arc<PendingEntry<B, R>>) -> bool
Return true if circ is still pending.
A tunnel will become non-pending when finishes (successfully or not), or when it’s
removed from this list via clear_all_tunnels().
Sourcefn add_pending_request(&mut self, pending: &Arc<PendingRequest<B, R>>)
fn add_pending_request(&mut self, pending: &Arc<PendingRequest<B, R>>)
Construct and add a new entry to the set of request waiting for a tunnel.
Return the request, and a new receiver stream that it should use for notification of possible tunnels to use.
Sourcefn find_pending_requests(
&self,
circ_spec: &SupportedTunnelUsage,
) -> Vec<Arc<PendingRequest<B, R>>>
fn find_pending_requests( &self, circ_spec: &SupportedTunnelUsage, ) -> Vec<Arc<PendingRequest<B, R>>>
Return all pending requests that would be satisfied by a tunnel
that supports circ_spec.
Sourcefn clear_all_tunnels(&mut self)
fn clear_all_tunnels(&mut self)
Clear all pending and open tunnels.
Calling clear_all_tunnels ensures that any request that is answered after
this method runs will receive a tunnels that was launched after this
method runs.
Auto Trait Implementations§
impl<B, R> Freeze for TunnelList<B, R>
impl<B, R> !RefUnwindSafe for TunnelList<B, R>
impl<B, R> Send for TunnelList<B, R>
impl<B, R> Sync for TunnelList<B, R>
impl<B, R> Unpin for TunnelList<B, R>
impl<B, R> UnsafeUnpin for TunnelList<B, R>
impl<B, R> !UnwindSafe for TunnelList<B, R>
Blanket Implementations§
Source§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
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
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§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>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§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>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§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.Source§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.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§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.Source§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.Source§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.Source§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.Source§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.Source§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.Source§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.Source§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.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§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 moreSource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§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 moreSource§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 moreSource§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
Source§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
Source§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.Source§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.Source§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.Source§impl<T> PossiblyOption<T> for T
impl<T> PossiblyOption<T> for T
Source§impl<T> Tap for T
impl<T> Tap for T
Source§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 moreSource§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 moreSource§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 moreSource§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 moreSource§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 moreSource§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 moreSource§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.Source§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.Source§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.Source§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.Source§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.Source§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.Source§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.