use std::os::raw::c_void;
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Arc;
#[derive(Debug, Clone, Default)]
pub struct CancelToken {
pub(crate) flag: Arc<AtomicBool>,
}
impl CancelToken {
pub fn new() -> Self {
CancelToken::default()
}
pub fn cancel(&self) {
self.flag.store(true, Ordering::SeqCst);
}
pub fn is_cancelled(&self) -> bool {
self.flag.load(Ordering::SeqCst)
}
pub fn reset(&self) {
self.flag.store(false, Ordering::SeqCst);
}
}
pub(crate) extern "C" fn abort_trampoline(userdata: *mut c_void) -> bool {
if userdata.is_null() {
return false;
}
let flag = unsafe { &*(userdata as *const AtomicBool) };
flag.load(Ordering::SeqCst)
}