• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 use crate::loom::sync::{Arc, Mutex};
2 use loom::sync::Notify;
3 
channel<T>() -> (Sender<T>, Receiver<T>)4 pub(crate) fn channel<T>() -> (Sender<T>, Receiver<T>) {
5     let inner = Arc::new(Inner {
6         notify: Notify::new(),
7         value: Mutex::new(None),
8     });
9 
10     let tx = Sender {
11         inner: inner.clone(),
12     };
13     let rx = Receiver { inner };
14 
15     (tx, rx)
16 }
17 
18 pub(crate) struct Sender<T> {
19     inner: Arc<Inner<T>>,
20 }
21 
22 pub(crate) struct Receiver<T> {
23     inner: Arc<Inner<T>>,
24 }
25 
26 struct Inner<T> {
27     notify: Notify,
28     value: Mutex<Option<T>>,
29 }
30 
31 impl<T> Sender<T> {
send(self, value: T)32     pub(crate) fn send(self, value: T) {
33         *self.inner.value.lock() = Some(value);
34         self.inner.notify.notify();
35     }
36 }
37 
38 impl<T> Receiver<T> {
recv(self) -> T39     pub(crate) fn recv(self) -> T {
40         loop {
41             if let Some(v) = self.inner.value.lock().take() {
42                 return v;
43             }
44 
45             self.inner.notify.wait();
46         }
47     }
48 }
49