blob: a8530b2d7b7439dc200b7172426da173b112b7c7 [file] [log] [blame]
use crate::syscalls;
use core::ptr;
pub struct SharedMemory<'a> {
driver_number: usize,
allow_number: usize,
buffer_to_share: &'a mut [u8],
}
impl<'a> SharedMemory<'a> {
pub fn new(
driver_number: usize,
allow_number: usize,
buffer_to_share: &'a mut [u8],
) -> SharedMemory<'a> {
SharedMemory {
driver_number,
allow_number,
buffer_to_share,
}
}
pub fn read_bytes(&self, destination: &mut [u8]) {
safe_copy(self.buffer_to_share, destination);
}
pub fn write_bytes(&mut self, source: &[u8]) {
safe_copy(source, self.buffer_to_share);
}
}
impl<'a> Drop for SharedMemory<'a> {
fn drop(&mut self) {
unsafe {
syscalls::allow_ptr(self.driver_number, self.allow_number, ptr::null_mut(), 0);
}
}
}
fn safe_copy(origin: &[u8], destination: &mut [u8]) {
let amount = origin.len().min(destination.len());
let origin = &origin[0..amount];
let destination = &mut destination[0..amount];
destination.clone_from_slice(origin);
}