use std::fmt;
use std::panic::{AssertUnwindSafe, catch_unwind};
use crate::task::Builtins;
use crate::task::execution::{BoxedRemoteFutureFactory, discard_panic};
pub(in crate::runtime) enum AsyncWorkerCommand<TS = Builtins> {
EnqueueTask {
future_factory: Option<BoxedRemoteFutureFactory<TS>>,
},
Shutdown,
}
impl<TS> Drop for AsyncWorkerCommand<TS> {
fn drop(&mut self) {
let Self::EnqueueTask { future_factory } = self else {
return;
};
let Some(future_factory) = future_factory.take() else {
return;
};
if let Err(panic) = catch_unwind(AssertUnwindSafe(|| drop(future_factory))) {
discard_panic(panic);
}
}
}
impl<TS> fmt::Debug for AsyncWorkerCommand<TS> {
#[cfg_attr(coverage_nightly, coverage(off))] #[cfg_attr(test, mutants::skip)] fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::EnqueueTask { .. } => write!(f, "EnqueueTask"),
Self::Shutdown => write!(f, "Shutdown"),
}
}
}