Skip to main content

SharedSubscriber

Struct SharedSubscriber 

Source
pub struct SharedSubscriber<Destination>
where Destination: Subscriber + UpgradeableObserver + Send + Sync,
{ /* private fields */ }
Expand description

§SharedSubscriber

This should be the very first thing you reach for when you want to share a subscriber between multiple places. Where each place with a clone of this can be sure to send signals to the exact same destination.

§Deadlock Protection

While Subscriber and other traits are implemented on plain Arc<Mutex<D>>s too, and those too have uses of their own, this struct here features deadlock protection in form of a deferred notification queue.

  • If the destination is not locked, the signals just go through.
  • If the destination is locked, the signal materializes into the queue and when the lock is released by the holder, the queue will clear itself, applying all deferred notifications.

Implementations§

Source§

impl<Destination> SharedSubscriber<Destination>
where Destination: Subscriber + UpgradeableObserver + Send + Sync,

Source

pub fn new(destination: Destination) -> SharedSubscriber<Destination>

Source

pub fn lock(&self) -> MutexGuard<'_, Destination>

Locks the shared destination. In case it encounters a poison error, the destination is immediately unsubscribed!

Source

pub fn downgrade(&self) -> Weak<Mutex<Destination>>

Trait Implementations§

Source§

impl<Destination> Clone for SharedSubscriber<Destination>
where Destination: Subscriber + Send + Sync,

Source§

fn clone(&self) -> SharedSubscriber<Destination>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<Destination> Debug for SharedSubscriber<Destination>
where Destination: Debug + Subscriber + UpgradeableObserver + Send + Sync, <Destination as ObserverInput>::In: Debug, <Destination as ObserverInput>::InError: Debug,

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl<Destination> Drop for SharedSubscriber<Destination>
where Destination: Subscriber + Send + Sync,

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

impl<Destination> ObserverInput for SharedSubscriber<Destination>
where Destination: Subscriber + UpgradeableObserver + Send + Sync,

Source§

type In = <Destination as ObserverInput>::In

Source§

type InError = <Destination as ObserverInput>::InError

Source§

impl<Destination> RxObserver for SharedSubscriber<Destination>
where Destination: 'static + Subscriber + Send + Sync,

Source§

fn next(&mut self, next: <SharedSubscriber<Destination> as ObserverInput>::In)

Signals the next value.
Source§

fn error( &mut self, error: <SharedSubscriber<Destination> as ObserverInput>::InError, )

Signals an error of upstream, no more next or complete calls are expected after this!
Source§

fn complete(&mut self)

Signals the completion of upstream, no more next or error calls are expected after this!
Source§

impl<Destination> SharedDestination<Destination> for SharedSubscriber<Destination>
where Destination: 'static + Subscriber + Send + Sync,

Source§

fn access<F>(&mut self, accessor: F)
where F: Fn(&Destination),

Source§

fn access_mut<F>(&mut self, accessor: F)

Source§

impl<Destination> SubscriptionLike for SharedSubscriber<Destination>
where Destination: 'static + Subscriber + Send + Sync,

Source§

fn is_closed(&self) -> bool

Returns if the subscription is closed or not. A subscription can be closed by calling unsubscribe on it. Some special subscriptions made by observables that only ever emit values during subscribe, will produce subscriptions that are created closed. Read more
Source§

fn unsubscribe(&mut self)

Releases all resources associated with this subscription, and marks it as closed. Read more
Source§

impl<Destination> TeardownCollection for SharedSubscriber<Destination>
where Destination: Subscriber + UpgradeableObserver + Send + Sync,

Source§

fn add_teardown(&mut self, teardown: Teardown)

Add additional teardowns to execute on unsubscribe. If the subscription is already closed, the added teardown is immediately executed!
Source§

impl<Destination> WithPrimaryCategory for SharedSubscriber<Destination>
where Destination: Subscriber + UpgradeableObserver + Send + Sync,

Source§

impl<Destination> ObserverUpgradesToSelf for SharedSubscriber<Destination>
where Destination: Subscriber + UpgradeableObserver + Send + Sync,

Auto Trait Implementations§

§

impl<Destination> Freeze for SharedSubscriber<Destination>

§

impl<Destination> RefUnwindSafe for SharedSubscriber<Destination>

§

impl<Destination> Send for SharedSubscriber<Destination>

§

impl<Destination> Sync for SharedSubscriber<Destination>

§

impl<Destination> Unpin for SharedSubscriber<Destination>

§

impl<Destination> UnwindSafe for SharedSubscriber<Destination>

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<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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. 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<S> EraseSubscriptionExtension for S
where S: SubscriptionWithTeardown + Send + Sync + 'static,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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> IntoResult<T> for T

Source§

fn into_result(self) -> Result<T, RunSystemError>

Converts this type into the system output type.
Source§

impl<T> ObserverPushObserverNotificationExtention for T
where T: RxObserver,

Source§

fn push( &mut self, notification: impl Into<ObserverNotification<<T as ObserverInput>::In, <T as ObserverInput>::InError>>, )

Source§

impl<T> ObserverPushObserverTerminalNotificationExtention for T
where T: RxObserver,

Source§

fn push( &mut self, notification: impl Into<ObserverTerminalNotification<<T as ObserverInput>::InError>>, )

Source§

impl<T> SubscriberPushNotificationExtention for T
where T: Subscriber,

Source§

fn push( &mut self, notification: impl Into<SubscriberNotification<<T as ObserverInput>::In, <T as ObserverInput>::InError>>, )

Source§

impl<Subscription> SubscriptionLikeExtensionIntoShared for Subscription
where Subscription: 'static + SubscriptionWithTeardown + Send + Sync,

Source§

fn into_shared(self) -> SharedSubscription

Wrap this subscription into a SharedSubscription, erasing it and allowing you to freely clone it, to unsubscribe it from multiple places.
Source§

impl<T> SubscriptionLikePushNotificationExtention for T
where T: SubscriptionLike + ?Sized,

Source§

fn push(&mut self, notification: impl Into<SubscriptionNotification>)

Source§

impl<S> TeardownCollectionExtension for S

Source§

fn add<T>(&mut self, teardown: T)
where T: Into<Teardown>,

Source§

fn add_fn<F>(&mut self, f: F)
where F: 'static + FnOnce() + Send + Sync, Self: Sized,

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. 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<T> UpgradeableObserver for T

Source§

impl<T> ConditionalSend for T
where T: Send,

Source§

impl<T> Signal for T
where T: 'static + Send + Sync,

Source§

impl<T> Subscriber for T

Source§

impl<T> SubscriptionWithTeardown for T