task/
join_handle.rs

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