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)
}
}
}