Skip to content

Commit

Permalink
✨ (sync::once): Add dropped, is_dropped, poll_dropped to `OnceT…
Browse files Browse the repository at this point in the history
…rigger`
  • Loading branch information
czy-29 committed Jan 19, 2025
1 parent af307d5 commit 88e2232
Showing 1 changed file with 48 additions and 0 deletions.
48 changes: 48 additions & 0 deletions src/sync/once.rs
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,18 @@ impl OnceTrigger {
pub fn trigger(self) -> bool {
self.0.send(()).is_ok()
}

pub async fn dropped(&mut self) {
self.0.closed().await
}

pub fn is_dropped(&self) -> bool {
self.0.is_closed()
}

pub fn poll_dropped(&mut self, cx: &mut Context<'_>) -> Poll<()> {
self.0.poll_closed(cx)
}
}

#[derive(Default, Debug, Copy, Clone, Eq, PartialEq, Hash)]
Expand Down Expand Up @@ -242,6 +254,42 @@ mod tests {
assert_eq!(waiter.has_been_triggered(), Triggered::Dropped);
}

#[test]
fn is_dropped() {
let (trigger, waiter) = once_event();
assert!(!trigger.is_dropped());
drop(waiter);
assert!(trigger.is_dropped());
}

#[tokio::test(flavor = "multi_thread")]
async fn dropped() {
let (mut trigger, waiter) = once_event();
assert!(!trigger.is_dropped());

tokio::spawn(async move {
drop(waiter);
});

trigger.dropped().await;
assert!(trigger.is_dropped());
}

#[tokio::test(flavor = "multi_thread")]
async fn poll_dropped() {
use std::future::poll_fn;

let (mut trigger, waiter) = once_event();
assert!(!trigger.is_dropped());

tokio::spawn(async move {
drop(waiter);
});

poll_fn(|cx| trigger.poll_dropped(cx)).await;
assert!(trigger.is_dropped());
}

#[tokio::test(flavor = "multi_thread")]
async fn tokio_select() {
use std::time::Duration;
Expand Down

0 comments on commit 88e2232

Please sign in to comment.