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}