pub struct WeakMailboxSender<A: Actor> {
inner: WeakMailboxSenderInner<A>,
#[cfg(feature = "metrics")]
messages_sent: metrics::Counter,
#[cfg(feature = "metrics")]
lifecycle_signals_sent: metrics::Counter,
#[cfg(feature = "metrics")]
link_died_signals_sent: metrics::Counter,
}
enum WeakMailboxSenderInner<A: Actor> {
Bounded(mpsc::WeakSender<Signal<A>>),
Unbounded(mpsc::WeakUnboundedSender<Signal<A>>),
}
impl<A: Actor> WeakMailboxSender<A> {
pub fn upgrade(&self) -> Option<MailboxSender<A>> {
match &self.inner {
WeakMailboxSenderInner::Bounded(tx) => tx.upgrade().map(|tx| MailboxSender {
inner: MailboxSenderInner::Bounded(tx),
#[cfg(feature = "metrics")]
messages_sent: self.messages_sent.clone(),
#[cfg(feature = "metrics")]
lifecycle_signals_sent: self.lifecycle_signals_sent.clone(),
#[cfg(feature = "metrics")]
link_died_signals_sent: self.link_died_signals_sent.clone(),
}),
WeakMailboxSenderInner::Unbounded(tx) => tx.upgrade().map(|tx| MailboxSender {
inner: MailboxSenderInner::Unbounded(tx),
#[cfg(feature = "metrics")]
messages_sent: self.messages_sent.clone(),
#[cfg(feature = "metrics")]
lifecycle_signals_sent: self.lifecycle_signals_sent.clone(),
#[cfg(feature = "metrics")]
link_died_signals_sent: self.link_died_signals_sent.clone(),
}),
}
}
pub fn strong_count(&self) -> usize {
match &self.inner {
WeakMailboxSenderInner::Bounded(tx) => tx.strong_count(),
WeakMailboxSenderInner::Unbounded(tx) => tx.strong_count(),
}
}
pub fn weak_count(&self) -> usize {
match &self.inner {
WeakMailboxSenderInner::Bounded(tx) => tx.weak_count(),
WeakMailboxSenderInner::Unbounded(tx) => tx.weak_count(),
}
}
}
impl<A: Actor> Clone for WeakMailboxSender<A> {
fn clone(&self) -> Self {
match &self.inner {
WeakMailboxSenderInner::Bounded(tx) => WeakMailboxSender {
inner: WeakMailboxSenderInner::Bounded(tx.clone()),
#[cfg(feature = "metrics")]
messages_sent: self.messages_sent.clone(),
#[cfg(feature = "metrics")]
lifecycle_signals_sent: self.lifecycle_signals_sent.clone(),
#[cfg(feature = "metrics")]
link_died_signals_sent: self.link_died_signals_sent.clone(),
},
WeakMailboxSenderInner::Unbounded(tx) => WeakMailboxSender {
inner: WeakMailboxSenderInner::Unbounded(tx.clone()),
#[cfg(feature = "metrics")]
messages_sent: self.messages_sent.clone(),
#[cfg(feature = "metrics")]
lifecycle_signals_sent: self.lifecycle_signals_sent.clone(),
#[cfg(feature = "metrics")]
link_died_signals_sent: self.link_died_signals_sent.clone(),
},
}
}
}
impl<A: Actor> fmt::Debug for WeakMailboxSender<A> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match &self.inner {
WeakMailboxSenderInner::Bounded(tx) => f.debug_tuple("Bounded").field(tx).finish(),
WeakMailboxSenderInner::Unbounded(tx) => f.debug_tuple("Unbounded").field(tx).finish(),
}
}
}