Skip to main content

TunnelList

Struct TunnelList 

Source
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:

  1. 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.
  2. 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>

Source

fn new() -> Self

Make a new empty CircList

Source

fn add_open(&mut self, e: OpenEntry<B::Tunnel>)

Add e to the list of open tunnels.

Source

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.

Source

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.

Source

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.

Source

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.

Source

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.

Source

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.

Source

fn add_pending_tunnel(&mut self, pending: Arc<PendingEntry<B, R>>)

Add pending to the set of in-progress tunnels.

Source

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.

Source

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().

Source

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.

Source

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.

Source

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<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

Source§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

Source§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

Source§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Converts 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>

Converts 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)

Converts &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)

Converts &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
where T: Any + Send,

Source§

fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>

Converts Box<Trait> (where Trait: DowncastSend) to Box<dyn Any + Send>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

Source§

fn into_any_sync(self: Box<T>) -> Box<dyn Any + Sync + Send>

Converts Box<Trait> (where Trait: DowncastSync) to Box<dyn Any + Send + Sync>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Converts Arc<Trait> (where Trait: DowncastSync) to Arc<Any>, which can then be downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows 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
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows 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
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> PossiblyOption<T> for T

Source§

fn to_option(self) -> Option<T>

Convert this object into an Option<T>
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .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
where Self: BorrowMut<B>, B: ?Sized,

Calls .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
where Self: AsRef<R>, R: ?Sized,

Calls .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
where Self: AsMut<R>, R: ?Sized,

Calls .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
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more