use crate::error::{Error, Result};
use crate::sys;
use std::sync::Arc;
struct Inner {
raw: *mut sys::llam_cancel_token_t,
}
unsafe impl Send for Inner {}
unsafe impl Sync for Inner {}
impl Drop for Inner {
fn drop(&mut self) {
if !self.raw.is_null() {
unsafe {
let _ = sys::llam_cancel_token_destroy(self.raw);
}
}
}
}
#[derive(Clone)]
pub struct CancelToken {
inner: Arc<Inner>,
}
impl CancelToken {
pub fn new() -> Result<Self> {
let raw = unsafe { sys::llam_cancel_token_create() };
if raw.is_null() {
Err(Error::last())
} else {
Ok(Self {
inner: Arc::new(Inner { raw }),
})
}
}
pub fn cancel(&self) -> Result<()> {
let rc = unsafe { sys::llam_cancel_token_cancel(self.inner.raw) };
if rc == 0 {
Ok(())
} else {
Err(Error::last())
}
}
pub fn is_cancelled(&self) -> bool {
unsafe { sys::llam_cancel_token_is_cancelled(self.inner.raw) != 0 }
}
pub(crate) fn raw(&self) -> *mut sys::llam_cancel_token_t {
self.inner.raw
}
}