Struct memflow::mem::phys_mem::middleware::delay::DelayedPhysicalMemory
source · pub struct DelayedPhysicalMemory<T> { /* private fields */ }
Expand description
The delay middleware introduces delay and jitter into physical reads which allows users to simulate different connectors and setups.
Since this middleware implements PhysicalMemory
it can be used as a replacement
in all structs and functions that require the PhysicalMemory
trait.
Implementations§
source§impl<T: PhysicalMemory> DelayedPhysicalMemory<T>
impl<T: PhysicalMemory> DelayedPhysicalMemory<T>
sourcepub fn new(mem: T, delay: Duration) -> Self
pub fn new(mem: T, delay: Duration) -> Self
Constructs a new middleware with the given delay.
This function is used when manually constructing a middleware inside of the memflow crate itself.
For general usage it is advised to just use the builder to construct the delay.
sourcepub fn into_inner(self) -> T
pub fn into_inner(self) -> T
Consumes self and returns the containing memory object.
This function can be useful in case the ownership over the memory object has been given to the cache
when it was being constructed.
It will destroy the self
and return back the ownership of the underlying memory object.
Examples
use memflow::architecture::x86::x64;
use memflow::mem::{PhysicalMemory, DelayedPhysicalMemory, MemoryView};
fn build<T: PhysicalMemory>(mem: T) -> T {
let mut middleware = DelayedPhysicalMemory::builder(mem)
.build()
.unwrap();
// use the middleware...
let value: u64 = middleware.phys_view().read(0.into()).unwrap();
assert_eq!(value, MAGIC_VALUE);
// retrieve ownership of mem and return it back
middleware.into_inner()
}
source§impl<T: PhysicalMemory> DelayedPhysicalMemory<T>
impl<T: PhysicalMemory> DelayedPhysicalMemory<T>
sourcepub fn builder(mem: T) -> DelayedPhysicalMemoryBuilder<T>
pub fn builder(mem: T) -> DelayedPhysicalMemoryBuilder<T>
Returns a new builder for the delay middleware with default settings.
Trait Implementations§
source§impl<T> Clone for DelayedPhysicalMemory<T>where
T: Clone,
impl<T> Clone for DelayedPhysicalMemory<T>where
T: Clone,
source§impl<'cglue_a, CGlueInst: Deref<Target = DelayedPhysicalMemory<T>>, CGlueCtx: ContextBounds, T: PhysicalMemory> ConnectorInstanceVtableFiller<'cglue_a, CGlueInst, CGlueCtx> for DelayedPhysicalMemory<T>
impl<'cglue_a, CGlueInst: Deref<Target = DelayedPhysicalMemory<T>>, CGlueCtx: ContextBounds, T: PhysicalMemory> ConnectorInstanceVtableFiller<'cglue_a, CGlueInst, CGlueCtx> for DelayedPhysicalMemory<T>
fn fill_table( table: ConnectorInstanceVtables<'cglue_a, CGlueInst, CGlueCtx> ) -> ConnectorInstanceVtables<'cglue_a, CGlueInst, CGlueCtx>
source§impl<T: PhysicalMemory> PhysicalMemory for DelayedPhysicalMemory<T>
impl<T: PhysicalMemory> PhysicalMemory for DelayedPhysicalMemory<T>
fn phys_read_raw_iter( &mut self, data: PhysicalReadMemOps<'_, '_, '_, '_> ) -> Result<()>
fn phys_write_raw_iter( &mut self, data: PhysicalWriteMemOps<'_, '_, '_, '_> ) -> Result<()>
source§fn metadata(&self) -> PhysicalMemoryMetadata
fn metadata(&self) -> PhysicalMemoryMetadata
source§fn set_mem_map(&mut self, mem_map: &[PhysicalMemoryMapping])
fn set_mem_map(&mut self, mem_map: &[PhysicalMemoryMapping])
fn phys_read_into<T: Pod + ?Sized>(
&mut self,
addr: PhysicalAddress,
out: &mut T
) -> Result<()>where
Self: Sized,
fn phys_write<T: Pod + ?Sized>(
&mut self,
addr: PhysicalAddress,
data: &T
) -> Result<()>where
Self: Sized,
fn into_phys_view(self) -> PhysicalMemoryView<Self>where
Self: Sized,
fn phys_view(&mut self) -> PhysicalMemoryView<Fwd<&mut Self>>where
Self: Sized,
fn into_mem_view(self) -> PhysicalMemoryView<Self>where
Self: Sized,
fn mem_view(&mut self) -> PhysicalMemoryView<Fwd<&mut Self>>where
Self: Sized,
Auto Trait Implementations§
impl<T> RefUnwindSafe for DelayedPhysicalMemory<T>where
T: RefUnwindSafe,
impl<T> Send for DelayedPhysicalMemory<T>where
T: Send,
impl<T> Sync for DelayedPhysicalMemory<T>where
T: Sync,
impl<T> Unpin for DelayedPhysicalMemory<T>where
T: Unpin,
impl<T> UnwindSafe for DelayedPhysicalMemory<T>where
T: UnwindSafe,
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<'a, T> BorrowOwned<'a> for Twhere
T: 'a + Clone,
impl<'a, T> BorrowOwned<'a> for Twhere
T: 'a + Clone,
fn r_borrow( this: &'a <T as BorrowOwned<'a>>::ROwned ) -> <T as BorrowOwned<'a>>::RBorrowed
fn r_to_owned( this: <T as BorrowOwned<'a>>::RBorrowed ) -> <T as BorrowOwned<'a>>::ROwned
fn deref_borrowed(this: &<T as BorrowOwned<'a>>::RBorrowed) -> &T
fn deref_owned(this: &<T as BorrowOwned<'a>>::ROwned) -> &T
fn from_cow_borrow(this: &'a T) -> <T as BorrowOwned<'a>>::RBorrowed
fn from_cow_owned(this: <T as ToOwned>::Owned) -> <T as BorrowOwned<'a>>::ROwned
fn into_cow_borrow(this: <T as BorrowOwned<'a>>::RBorrowed) -> &'a T
fn into_cow_owned(this: <T as BorrowOwned<'a>>::ROwned) -> <T as ToOwned>::Owned
source§impl<T> GetWithMetadata for T
impl<T> GetWithMetadata for T
§type ForSelf = WithMetadata_<T, T>
type ForSelf = WithMetadata_<T, T>
WithMetadata_<Self, Self>
§impl<S> ROExtAcc for S
impl<S> ROExtAcc for S
§fn f_get<F>(&self, offset: FieldOffset<S, F, Aligned>) -> &F
fn f_get<F>(&self, offset: FieldOffset<S, F, Aligned>) -> &F
offset
. Read more§fn f_get_mut<F>(&mut self, offset: FieldOffset<S, F, Aligned>) -> &mut F
fn f_get_mut<F>(&mut self, offset: FieldOffset<S, F, Aligned>) -> &mut F
offset
. Read more§fn f_get_ptr<F, A>(&self, offset: FieldOffset<S, F, A>) -> *const F
fn f_get_ptr<F, A>(&self, offset: FieldOffset<S, F, A>) -> *const F
offset
. Read more§fn f_get_mut_ptr<F, A>(&mut self, offset: FieldOffset<S, F, A>) -> *mut F
fn f_get_mut_ptr<F, A>(&mut self, offset: FieldOffset<S, F, A>) -> *mut F
offset
. Read more§impl<S> ROExtOps<Aligned> for S
impl<S> ROExtOps<Aligned> for S
§fn f_replace<F>(&mut self, offset: FieldOffset<S, F, Aligned>, value: F) -> F
fn f_replace<F>(&mut self, offset: FieldOffset<S, F, Aligned>, value: F) -> F
offset
) with value
,
returning the previous value of the field. Read more§fn f_get_copy<F>(&self, offset: FieldOffset<S, F, Aligned>) -> Fwhere
F: Copy,
fn f_get_copy<F>(&self, offset: FieldOffset<S, F, Aligned>) -> Fwhere
F: Copy,
§impl<S> ROExtOps<Unaligned> for S
impl<S> ROExtOps<Unaligned> for S
§fn f_replace<F>(&mut self, offset: FieldOffset<S, F, Unaligned>, value: F) -> F
fn f_replace<F>(&mut self, offset: FieldOffset<S, F, Unaligned>, value: F) -> F
offset
) with value
,
returning the previous value of the field. Read more§fn f_get_copy<F>(&self, offset: FieldOffset<S, F, Unaligned>) -> Fwhere
F: Copy,
fn f_get_copy<F>(&self, offset: FieldOffset<S, F, Unaligned>) -> Fwhere
F: Copy,
§impl<T> SelfOps for Twhere
T: ?Sized,
impl<T> SelfOps for Twhere
T: ?Sized,
§fn piped<F, U>(self, f: F) -> U
fn piped<F, U>(self, f: F) -> U
§fn piped_ref<'a, F, U>(&'a self, f: F) -> U
fn piped_ref<'a, F, U>(&'a self, f: F) -> U
piped
except that the function takes &Self
Useful for functions that take &Self
instead of Self
. Read more§fn piped_mut<'a, F, U>(&'a mut self, f: F) -> Uwhere
F: FnOnce(&'a mut Self) -> U,
fn piped_mut<'a, F, U>(&'a mut self, f: F) -> Uwhere
F: FnOnce(&'a mut Self) -> U,
piped
, except that the function takes &mut Self
.
Useful for functions that take &mut Self
instead of Self
.§fn mutated<F>(self, f: F) -> Self
fn mutated<F>(self, f: F) -> Self
§fn observe<F>(self, f: F) -> Self
fn observe<F>(self, f: F) -> Self
§fn as_ref_<T>(&self) -> &T
fn as_ref_<T>(&self) -> &T
AsRef
,
using the turbofish .as_ref_::<_>()
syntax. Read more