use crate::util::Address;
use libc::c_void;
#[repr(transparent)]
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub struct OpaquePointer(*mut c_void);
unsafe impl Sync for OpaquePointer {}
unsafe impl Send for OpaquePointer {}
impl Default for OpaquePointer {
fn default() -> Self {
Self::UNINITIALIZED
}
}
impl OpaquePointer {
pub const UNINITIALIZED: Self = Self(std::ptr::null_mut::<c_void>());
pub fn from_address(addr: Address) -> Self {
OpaquePointer(addr.to_mut_ptr::<c_void>())
}
pub fn to_address(self) -> Address {
Address::from_mut_ptr(self.0)
}
pub fn is_null(self) -> bool {
self.0.is_null()
}
}
#[repr(transparent)]
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub struct VMThread(pub OpaquePointer);
impl VMThread {
pub const UNINITIALIZED: Self = Self(OpaquePointer::UNINITIALIZED);
}
#[repr(transparent)]
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub struct VMMutatorThread(pub VMThread);
#[repr(transparent)]
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub struct VMWorkerThread(pub VMThread);