use loom::sync::Notify; use std::sync::{Arc, Mutex}; pub(crate) fn channel() -> (Sender, Receiver) { let inner = Arc::new(Inner { notify: Notify::new(), value: Mutex::new(None), }); let tx = Sender { inner: inner.clone(), }; let rx = Receiver { inner }; (tx, rx) } pub(crate) struct Sender { inner: Arc>, } pub(crate) struct Receiver { inner: Arc>, } struct Inner { notify: Notify, value: Mutex>, } impl Sender { pub(crate) fn send(self, value: T) { *self.inner.value.lock().unwrap() = Some(value); self.inner.notify.notify(); } } impl Receiver { pub(crate) fn recv(self) -> T { loop { if let Some(v) = self.inner.value.lock().unwrap().take() { return v; } self.inner.notify.wait(); } } }