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}