Skip to main content

sequoia_async/
wake.rs

1#![forbid(unsafe_code)]
2
3use std::sync::Arc;
4
5pub type WakeFn = Arc<dyn Fn() + Send + Sync>;
6
7pub fn noop_wake() -> WakeFn {
8    Arc::new(|| {})
9}
10
11pub fn fn_wake(f: impl Fn() + Send + Sync + 'static) -> WakeFn {
12    Arc::new(f)
13}
14
15#[cfg(test)]
16mod tests {
17    use super::*;
18    use std::sync::atomic::{AtomicUsize, Ordering};
19
20    #[test]
21    fn noop_wake_does_nothing() {
22        noop_wake()();
23    }
24
25    #[test]
26    fn fn_wake_calls_closure() {
27        let n = Arc::new(AtomicUsize::new(0));
28        let probe = Arc::clone(&n);
29        let w = fn_wake(move || {
30            probe.fetch_add(1, Ordering::SeqCst);
31        });
32        w();
33        w();
34        assert_eq!(n.load(Ordering::SeqCst), 2);
35    }
36}