use std::ptr;
pub struct Cancellation {
data: *mut (),
metadata: usize,
drop: unsafe fn(*mut (), usize),
}
impl Cancellation {
pub unsafe fn new(
data: *mut (),
metadata: usize,
drop: unsafe fn(*mut (), usize),
) -> Cancellation {
Cancellation {
data,
metadata,
drop,
}
}
pub fn null() -> Cancellation {
unsafe fn drop(_: *mut (), _: usize) {}
Cancellation {
data: ptr::null_mut(),
metadata: 0,
drop,
}
}
pub(crate) unsafe fn buffer(data: *mut u8, len: usize) -> Cancellation {
unsafe fn drop(data: *mut (), len: usize) {
std::mem::drop(Vec::from_raw_parts(data as *mut u8, len, len))
}
Cancellation::new(data as *mut (), len, drop)
}
}
unsafe impl Send for Cancellation {}
unsafe impl Sync for Cancellation {}
impl Drop for Cancellation {
fn drop(&mut self) {
unsafe { (self.drop)(self.data, self.metadata) }
}
}