cuckoo_runtime/
join_handle.rs1use 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}