Skip to main content

cuckoo_runtime/
join_handle.rs

1use async_task::Task;
2use pin_project_lite::pin_project;
3
4pin_project! {
5    pub struct JoinHandle<T> {
6        #[pin]
7        pub(crate) task: Option<Task<T>>,
8    }
9
10    impl<T> PinnedDrop for JoinHandle<T> {
11        fn drop(this: Pin<&mut Self>) {
12            if let Some(task) = this.project().task.take() {
13                task.detach();
14            }
15        }
16    }
17}
18
19impl<T> JoinHandle<T> {
20    pub async fn abort(mut self) {
21        if let Some(task) = self.task.take() {
22            task.cancel().await;
23        }
24    }
25}
26
27impl<T> Future for JoinHandle<T> {
28    type Output = T;
29
30    fn poll(
31        self: std::pin::Pin<&mut Self>,
32        cx: &mut std::task::Context<'_>,
33    ) -> std::task::Poll<Self::Output> {
34        if let Some(task) = self.project().task.as_pin_mut() {
35            task.poll(cx)
36        } else {
37            unreachable!("Polled an empty JoinHandle");
38        }
39    }
40}