diff --git a/Cargo.toml b/Cargo.toml index ebb1e1d..a5d701a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,7 @@ edition = "2024" [dependencies] [lints] -rust = { nonstandard_style = "allow" } +rust = { nonstandard_style = "allow", drop_bounds = "allow" } [workspace] diff --git a/src/virtual_memory.rs b/src/virtual_memory.rs index 97bd74c..392e76e 100644 --- a/src/virtual_memory.rs +++ b/src/virtual_memory.rs @@ -1,3 +1,5 @@ +use std::fs::read_to_string; + pub unsafe trait VirtualMemoryApi: Sized + Drop { type Reservation<'s>: Reservation + 's where @@ -5,20 +7,47 @@ pub unsafe trait VirtualMemoryApi: Sized + Drop { fn getPageSize(&self) -> usize; - fn reserveMemory<'s>( - &'s self, - extend: ReservationToExtend<&Self::Reservation<'s>>, - pagesCount: usize, - ) -> Option>; -} + fn reserveMemory<'s>(&'s self, pagesCount: usize) -> Option>; -pub enum ReservationToExtend { - ReserveAnywhere, - TryExtend(T), + unsafe fn extendReservation<'s>( + &'s self, + base: &Self::Reservation<'s>, + pagesCount: usize, + ) -> ExtendResult>; } pub unsafe trait Reservation: Sized + Ord + Drop { + fn getPageSize(&self) -> usize; + fn pagesCount(&self) -> usize; unsafe fn commitPages(&mut self, indexOfFirst: usize, count: usize) -> *mut [u8]; unsafe fn decommitPages(&mut self, indexOfFirst: usize, count: usize); unsafe fn release(self); } + +pub enum ExtendResult { + OutOfMemory, + ContinuationIsBusy, + Success(T), +} + +impl ExtendResult { + pub fn map(&self, caster: impl FnOnce(&T) -> R) -> ExtendResult { + match self { + ExtendResult::Success(v) => { + return ExtendResult::Success(caster(&v)); + } + ExtendResult::ContinuationIsBusy => return ExtendResult::ContinuationIsBusy, + ExtendResult::OutOfMemory => return ExtendResult::OutOfMemory, + } + } + + pub fn map_into(self, caster: impl FnOnce(T) -> R) -> ExtendResult { + match self { + ExtendResult::Success(v) => { + return ExtendResult::Success(caster(v)); + } + ExtendResult::ContinuationIsBusy => return ExtendResult::ContinuationIsBusy, + ExtendResult::OutOfMemory => return ExtendResult::OutOfMemory, + } + } +}