task/
join_handle.rs

1use synchronization::{Arc, blocking_mutex::raw::CriticalSectionRawMutex, signal::Signal};
2
3pub struct JoinHandle<T>(Arc<Signal<CriticalSectionRawMutex, T>>);
4
5unsafe impl<T> Send for JoinHandle<T> {}
6unsafe impl<T> Sync for JoinHandle<T> {}
7
8impl<T> JoinHandle<T> {
9    pub fn new() -> (Self, Self) {
10        let signal = Signal::<CriticalSectionRawMutex, T>::new();
11
12        let arc = Arc::new(signal);
13
14        (Self(arc.clone()), Self(arc))
15    }
16
17    pub(crate) fn signal(&self, value: T) {
18        self.0.signal(value);
19    }
20
21    pub async fn join(self) -> T {
22        self.0.wait().await
23    }
24}