use crate::borrow::BorrowChecker;
use crate::{BorrowHandle, GuestError, GuestMemory, Region};
use std::cell::UnsafeCell;
pub struct WasmtimeGuestMemory<'a> {
mem: &'a [UnsafeCell<u8>],
bc: BorrowChecker,
shared: bool,
}
unsafe impl Send for WasmtimeGuestMemory<'_> {}
unsafe impl Sync for WasmtimeGuestMemory<'_> {}
impl<'a> WasmtimeGuestMemory<'a> {
pub fn new(mem: &'a mut [u8]) -> Self {
Self {
mem: unsafe { std::slice::from_raw_parts(mem.as_ptr().cast(), mem.len()) },
bc: BorrowChecker::new(),
shared: false,
}
}
pub fn shared(mem: &'a [UnsafeCell<u8>]) -> Self {
Self {
mem,
bc: BorrowChecker::new(),
shared: true,
}
}
}
unsafe impl GuestMemory for WasmtimeGuestMemory<'_> {
#[inline]
fn base(&self) -> &[UnsafeCell<u8>] {
self.mem
}
#[inline]
fn has_outstanding_borrows(&self) -> bool {
!self.shared && self.bc.has_outstanding_borrows()
}
#[inline]
fn is_shared_borrowed(&self, r: Region) -> bool {
!self.shared && self.bc.is_shared_borrowed(r)
}
#[inline]
fn is_mut_borrowed(&self, r: Region) -> bool {
!self.shared && self.bc.is_mut_borrowed(r)
}
#[inline]
fn shared_borrow(&self, r: Region) -> Result<BorrowHandle, GuestError> {
debug_assert!(!self.shared);
self.bc.shared_borrow(r)
}
#[inline]
fn mut_borrow(&self, r: Region) -> Result<BorrowHandle, GuestError> {
debug_assert!(!self.shared);
self.bc.mut_borrow(r)
}
#[inline]
fn shared_unborrow(&self, h: BorrowHandle) {
debug_assert!(!self.shared);
self.bc.shared_unborrow(h)
}
#[inline]
fn mut_unborrow(&self, h: BorrowHandle) {
debug_assert!(!self.shared);
self.bc.mut_unborrow(h)
}
#[inline]
fn is_shared_memory(&self) -> bool {
self.shared
}
}