use crate::system;
pub struct MirrorBuffer {
ptr: *mut u8,
size: usize,
}
unsafe impl Send for MirrorBuffer {}
unsafe impl Sync for MirrorBuffer {}
impl MirrorBuffer {
pub fn new(mut size: usize) -> Result<Self, String> {
size = align_to_page(size);
let ptr = unsafe { system::allocate_mirror(size)? };
Ok(Self { ptr, size })
}
pub fn size(&self) -> usize {
self.size
}
#[inline]
pub fn as_mut_slice(&mut self) -> &mut [u8] {
unsafe { core::slice::from_raw_parts_mut(self.ptr, 2 * self.size) }
}
#[inline]
pub fn as_slice(&self) -> &[u8] {
unsafe { core::slice::from_raw_parts(self.ptr, 2 * self.size) }
}
#[inline]
pub fn as_mut_ptr(&self) -> *mut u8 {
self.ptr
}
}
impl Drop for MirrorBuffer {
fn drop(&mut self) {
unsafe {
system::deallocate_mirror(self.ptr, self.size);
}
}
}
pub fn align_to_page(size: usize) -> usize {
let page_size = system::get_page_size();
(size + page_size - 1) & !(page_size - 1)
}