Struct voladdress::VolAddress
source · pub struct VolAddress<T, R, W> { /* private fields */ }
Expand description
A volatile address.
This type stores a memory address and provides ergonomic volatile access to said memory address.
Note that this type has several methods for accessing the data at the
address specified, and a particular instance of this type can use them
unsafely, use them safely, or not use them at all based on the generic
values of R
and W
(explained below).
read
write
apply
(reads, runs a function, then writes)
§Generic Parameters
T
: The type of the value stored at the address.- The target type type must impl
Copy
for reading and writing to be allowed.
- The target type type must impl
R
: If the address is readable.- If
R=Safe
then you can safely read from the address. - If
R=Unsafe
then you can unsafely read from the address. - Otherwise you cannot read from the address.
- If
W
: If the address is writable.- If
W=Safe
then you can safely write to the address. - If
W=Unsafe
then you can unsafely write to the address. - Otherwise you cannot write to the address.
- If
The VolAddress
type is intended to represent a single value of a T
type
that is the size of a single machine register (or less).
- If there’s an array of contiguous
T
values you want to model, consider usingVolBlock
instead. - If there’s a series of strided
T
values you want to model, consider usingVolSeries
instead. - If the
T
type is larger than a single machine register it’s probably not a good fit for theVolAddress
abstraction.
§Safety
This type’s safety follows the “unsafe creation, then safe use” strategy.
- Validity Invariant: The address of a
VolAddress
must always be non-zero, or you will instantly trigger UB. - Safety Invariant: The address of a
VolAddress
must be an aligned and legal address for aT
type value (with correctR
andW
permissions) within the device’s memory space, otherwise theread
andwrite
methods will trigger UB when called. - Synchronization Invariant: Volatile access has no cross-thread synchronization behavior within the LLVM memory model. The results of all volatile access is target-dependent, including cross-thread access. Volatile access has no automatic synchronization of its own, and so if your target requires some sort of synchronization for volatile accesses of the address in question you must provide the appropriate synchronization in some way external to this type.
Implementations§
source§impl<T, R, W> VolAddress<T, R, W>
impl<T, R, W> VolAddress<T, R, W>
sourcepub const unsafe fn cast<Z>(self) -> VolAddress<Z, R, W>
pub const unsafe fn cast<Z>(self) -> VolAddress<Z, R, W>
sourcepub const unsafe fn change_permissions<NewRead, NewWrite>(
self
) -> VolAddress<T, NewRead, NewWrite>
pub const unsafe fn change_permissions<NewRead, NewWrite>( self ) -> VolAddress<T, NewRead, NewWrite>
Changes the permissions of the address to the new read and write permissions specified.
§Safety
- As per the type docs
sourcepub const fn as_ptr(self) -> *const T
pub const fn as_ptr(self) -> *const T
Converts the VolAddress
into const pointer form.
This should usually only be used when you need to call a foreign function that expects a pointer.
sourcepub const fn as_mut_ptr(self) -> *mut T
pub const fn as_mut_ptr(self) -> *mut T
Converts the VolAddress
into mut pointer form.
This should usually only be used when you need to call a foreign function that expects a pointer.
sourcepub const unsafe fn add(self, count: usize) -> Self
pub const unsafe fn add(self, count: usize) -> Self
Advances the pointer by the given number of positions (usize
).
Shorthand for addr.offset(count as isize)
This is intended to basically work like <*mut T>::wrapping_add
.
§Safety
- As per the type docs
sourcepub const unsafe fn sub(self, count: usize) -> Self
pub const unsafe fn sub(self, count: usize) -> Self
Reverses the pointer by the given number of positions (usize
).
Shorthand for addr.offset((count as isize).wrapping_neg())
This is intended to basically work like <*mut T>::wrapping_sub
.
§Safety
- As per the type docs
sourcepub const unsafe fn offset(self, count: isize) -> Self
pub const unsafe fn offset(self, count: isize) -> Self
Offsets the address by the given number of positions (isize
).
This is intended to basically work like <*mut T>::wrapping_offset
.
§Safety
- As per the type docs
source§impl<T, R, W, const C: usize> VolAddress<[T; C], R, W>
impl<T, R, W, const C: usize> VolAddress<[T; C], R, W>
sourcepub const unsafe fn as_volblock(self) -> VolBlock<T, R, W, C>
pub const unsafe fn as_volblock(self) -> VolBlock<T, R, W, C>
Converts an address for an array to a block for each element of the array.
§Safety
- As per the
VolBlock
construction rules. - It is highly likely that on any device this is safe, but because of
possible strangeness with volatile side effects this is marked as an
unsafe
method.
source§impl<T, W> VolAddress<T, Safe, W>where
T: Copy,
impl<T, W> VolAddress<T, Safe, W>where
T: Copy,
source§impl<T, W> VolAddress<T, Unsafe, W>where
T: Copy,
impl<T, W> VolAddress<T, Unsafe, W>where
T: Copy,
source§impl<T, R> VolAddress<T, R, Safe>where
T: Copy,
impl<T, R> VolAddress<T, R, Safe>where
T: Copy,
source§impl<T, R> VolAddress<T, R, Unsafe>where
T: Copy,
impl<T, R> VolAddress<T, R, Unsafe>where
T: Copy,
Trait Implementations§
source§impl<T, R, W> Clone for VolAddress<T, R, W>
impl<T, R, W> Clone for VolAddress<T, R, W>
source§impl<T, R, W> Debug for VolAddress<T, R, W>
impl<T, R, W> Debug for VolAddress<T, R, W>
source§impl<T: Ord, R: Ord, W: Ord> Ord for VolAddress<T, R, W>
impl<T: Ord, R: Ord, W: Ord> Ord for VolAddress<T, R, W>
source§fn cmp(&self, other: &VolAddress<T, R, W>) -> Ordering
fn cmp(&self, other: &VolAddress<T, R, W>) -> Ordering
1.21.0 · source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere
Self: Sized,
source§impl<T: PartialEq, R: PartialEq, W: PartialEq> PartialEq for VolAddress<T, R, W>
impl<T: PartialEq, R: PartialEq, W: PartialEq> PartialEq for VolAddress<T, R, W>
source§fn eq(&self, other: &VolAddress<T, R, W>) -> bool
fn eq(&self, other: &VolAddress<T, R, W>) -> bool
self
and other
values to be equal, and is used
by ==
.source§impl<T: PartialOrd, R: PartialOrd, W: PartialOrd> PartialOrd for VolAddress<T, R, W>
impl<T: PartialOrd, R: PartialOrd, W: PartialOrd> PartialOrd for VolAddress<T, R, W>
source§fn partial_cmp(&self, other: &VolAddress<T, R, W>) -> Option<Ordering>
fn partial_cmp(&self, other: &VolAddress<T, R, W>) -> Option<Ordering>
1.0.0 · source§fn le(&self, other: &Rhs) -> bool
fn le(&self, other: &Rhs) -> bool
self
and other
) and is used by the <=
operator. Read more