diff --git a/src/lib.rs b/src/lib.rs index 39497ef..c5d338a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -479,6 +479,42 @@ impl Event { inner } + + /// Return the listener count by acquiring a lock. + /// + /// This is just a snapshot of the number of listeners at this point in time. + /// It is possible for the actual number to change at any point. + /// The number should only ever be used as a hint. + /// This is only available when `std` feature is enabled. + /// + /// # Examples + /// + /// ``` + /// use event_listener::Event; + /// + /// let event = Event::new(); + /// + /// assert_eq!(event.total_listeners(), 0); + /// + /// let listener1 = event.listen(); + /// assert_eq!(event.total_listeners(), 1); + /// + /// let listener2 = event.listen(); + /// assert_eq!(event.total_listeners(), 2); + /// + /// drop(listener1); + /// drop(listener2); + /// assert_eq!(event.total_listeners(), 0); + /// ``` + #[cfg(feature = "std")] + #[inline] + pub fn total_listeners(&self) -> usize { + if let Some(inner) = self.try_inner() { + inner.list.total_listeners_wait() + } else { + 0 + } + } } impl Event<()> { diff --git a/src/std.rs b/src/std.rs index d0d0144..fb06819 100644 --- a/src/std.rs +++ b/src/std.rs @@ -44,7 +44,7 @@ impl List { notified: 0, })) } - // Accessor method because fields are private, not sure how to go around it + // Accessor method because fields are private, not sure how to go around it. pub fn total_listeners(&self) -> Result { match self.0.try_lock() { Ok(mutex) => { @@ -54,6 +54,14 @@ impl List { Err(_) => Err(""), } } + + // Get the listener count by blocking. + pub(crate) fn total_listeners_wait(&self) -> usize { + match self.0.lock() { + Ok(mutex) => mutex.len, + Err(err) => panic!("{err}"), + } + } } impl crate::Inner {