use std::{
future::Future,
io,
pin::Pin,
sync::Weak,
task::{Context, Poll},
};
use zbus::runtime::traits;
use super::{Inner, lock};
pub struct Task<T> {
task: async_task::Task<T>,
inner: Weak<Inner>,
}
impl<T> Task<T> {
pub(super) fn new(task: async_task::Task<T>, inner: Weak<Inner>) -> Self {
Self { task, inner }
}
}
impl<T> Future for Task<T> {
type Output = io::Result<T>;
fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
Pin::new(&mut self.task).poll(cx).map(Ok)
}
}
impl<T> traits::TaskHandle<T> for Task<T>
where
T: Send + 'static,
{
fn detach(self) {
let Some(inner) = self.inner.upgrade() else {
return;
};
lock(&inner.detached).push(Box::new(self.task));
}
}
pub(super) trait Detached: Send {
fn is_finished(&self) -> bool;
}
impl<T> Detached for async_task::Task<T>
where
T: Send,
{
fn is_finished(&self) -> bool {
async_task::Task::is_finished(self)
}
}