futures_test/task/
wake_counter.rs
1use futures_core::task::Waker;
2use futures_util::task::{self, ArcWake};
3use std::sync::atomic::{AtomicUsize, Ordering};
4use std::sync::Arc;
5
6#[derive(Debug)]
10pub struct AwokenCount {
11 inner: Arc<WakerInner>,
12}
13
14impl AwokenCount {
15 pub fn get(&self) -> usize {
17 self.inner.count.load(Ordering::SeqCst)
18 }
19}
20
21impl PartialEq<usize> for AwokenCount {
22 fn eq(&self, other: &usize) -> bool {
23 self.get() == *other
24 }
25}
26
27#[derive(Debug)]
28struct WakerInner {
29 count: AtomicUsize,
30}
31
32impl ArcWake for WakerInner {
33 fn wake_by_ref(arc_self: &Arc<Self>) {
34 let _ = arc_self.count.fetch_add(1, Ordering::SeqCst);
35 }
36}
37
38pub fn new_count_waker() -> (Waker, AwokenCount) {
57 let inner = Arc::new(WakerInner { count: AtomicUsize::new(0) });
58 (task::waker(inner.clone()), AwokenCount { inner })
59}