Skip to content

Commit

Permalink
feat: Add a way to get the current number of listeners
Browse files Browse the repository at this point in the history
  • Loading branch information
beckend committed Jan 25, 2024
1 parent 5f5135e commit a68f5ee
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 1 deletion.
36 changes: 36 additions & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -479,6 +479,42 @@ impl<T> Event<T> {

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<()> {
Expand Down
10 changes: 9 additions & 1 deletion src/std.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ impl<T> List<T> {
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<usize, &str> {
match self.0.try_lock() {
Ok(mutex) => {
Expand All @@ -54,6 +54,14 @@ impl<T> List<T> {
Err(_) => Err("<locked>"),
}
}

// 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<T> crate::Inner<T> {
Expand Down

0 comments on commit a68f5ee

Please sign in to comment.