use parking_lot::Mutex;
use tokio::task::AbortHandle;
pub trait RemoteCallable<T> {
fn call(&self, ctx: &T);
fn abort(&self);
}
#[derive(Default)]
pub(crate) struct OptionalAbortHandle {
inner: Mutex<Option<AbortHandle>>,
}
impl OptionalAbortHandle {
pub(crate) fn abort(&self) {
let mut lock = self.inner.lock();
if let Some(handle) = lock.take() {
drop(lock);
handle.abort();
}
}
pub(crate) fn replace(&self, handle: AbortHandle) {
let mut lock = self.inner.lock();
if let Some(old) = lock.replace(handle) {
old.abort();
}
}
}