1use std::{
2 future::Future,
3 marker::PhantomData,
4 pin::Pin,
5 task::{Context, Poll},
6};
7
8use super::raw::RawTask;
9
10pub struct JoinHandle<T> {
13 raw: RawTask,
14 _p: PhantomData<T>,
15}
16
17unsafe impl<T: Send> Send for JoinHandle<T> {}
18unsafe impl<T: Send> Sync for JoinHandle<T> {}
19
20impl<T> JoinHandle<T> {
21 pub(super) fn new(raw: RawTask) -> JoinHandle<T> {
22 JoinHandle {
23 raw,
24 _p: PhantomData,
25 }
26 }
27
28 pub fn is_finished(&self) -> bool {
30 let state = self.raw.header().state.load();
31 state.is_complete()
32 }
33}
34
35impl<T> Unpin for JoinHandle<T> {}
36
37impl<T> Future for JoinHandle<T> {
38 type Output = T;
39
40 fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
41 let mut ret = Poll::Pending;
42
43 unsafe {
55 self.raw
56 .try_read_output(&mut ret as *mut _ as *mut (), cx.waker());
57 }
58 ret
59 }
60}
61
62impl<T> Drop for JoinHandle<T> {
63 fn drop(&mut self) {
64 if self.raw.header().state.drop_join_handle_fast().is_ok() {
65 return;
66 }
67
68 self.raw.drop_join_handle_slow();
69 }
70}