Struct miri::concurrency::data_race::MemoryCellClocks
source · [−]struct MemoryCellClocks {
write: u32,
write_index: VectorIdx,
write_type: WriteType,
read: VClock,
atomic_ops: Option<Box<AtomicMemoryCellClocks>>,
}
Expand description
Memory Cell vector clock metadata for data-race detection.
Fields
write: u32
The vector-clock timestamp of the last write corresponding to the writing threads timestamp.
write_index: VectorIdx
The identifier of the vector index, corresponding to a thread that performed the last write operation.
write_type: WriteType
The type of operation that the write index represents, either newly allocated memory, a non-atomic write or a deallocation of memory.
read: VClock
The vector-clock of the timestamp of the last read operation performed by a thread since the last write operation occurred. It is reset to zero on each write operation.
atomic_ops: Option<Box<AtomicMemoryCellClocks>>
Atomic acquire & release sequence tracking clocks. For non-atomic memory in the common case this value is set to None.
Implementations
sourceimpl MemoryCellClocks
impl MemoryCellClocks
sourcefn new(alloc: u32, alloc_index: VectorIdx) -> Self
fn new(alloc: u32, alloc_index: VectorIdx) -> Self
Create a new set of clocks representing memory allocated at a given vector timestamp and index.
sourcefn atomic(&self) -> Option<&AtomicMemoryCellClocks>
fn atomic(&self) -> Option<&AtomicMemoryCellClocks>
Load the internal atomic memory cells if they exist.
sourcefn atomic_mut(&mut self) -> &mut AtomicMemoryCellClocks
fn atomic_mut(&mut self) -> &mut AtomicMemoryCellClocks
Load or create the internal atomic memory metadata if it does not exist.
sourcefn load_acquire(
&mut self,
clocks: &mut ThreadClockSet,
index: VectorIdx
) -> Result<(), DataRace>
fn load_acquire(
&mut self,
clocks: &mut ThreadClockSet,
index: VectorIdx
) -> Result<(), DataRace>
Update memory cell data-race tracking for atomic load acquire semantics, is a no-op if this memory was not used previously as atomic memory.
sourcefn race_free_with_atomic(&self, clocks: &ThreadClockSet) -> bool
fn race_free_with_atomic(&self, clocks: &ThreadClockSet) -> bool
Checks if the memory cell access is ordered with all prior atomic reads and writes
sourcefn load_relaxed(
&mut self,
clocks: &mut ThreadClockSet,
index: VectorIdx
) -> Result<(), DataRace>
fn load_relaxed(
&mut self,
clocks: &mut ThreadClockSet,
index: VectorIdx
) -> Result<(), DataRace>
Update memory cell data-race tracking for atomic load relaxed semantics, is a no-op if this memory was not used previously as atomic memory.
sourcefn store_release(
&mut self,
clocks: &ThreadClockSet,
index: VectorIdx
) -> Result<(), DataRace>
fn store_release(
&mut self,
clocks: &ThreadClockSet,
index: VectorIdx
) -> Result<(), DataRace>
Update the memory cell data-race tracking for atomic store release semantics.
sourcefn store_relaxed(
&mut self,
clocks: &ThreadClockSet,
index: VectorIdx
) -> Result<(), DataRace>
fn store_relaxed(
&mut self,
clocks: &ThreadClockSet,
index: VectorIdx
) -> Result<(), DataRace>
Update the memory cell data-race tracking for atomic store relaxed semantics.
sourcefn rmw_release(
&mut self,
clocks: &ThreadClockSet,
index: VectorIdx
) -> Result<(), DataRace>
fn rmw_release(
&mut self,
clocks: &ThreadClockSet,
index: VectorIdx
) -> Result<(), DataRace>
Update the memory cell data-race tracking for atomic store release semantics for RMW operations.
sourcefn rmw_relaxed(
&mut self,
clocks: &ThreadClockSet,
index: VectorIdx
) -> Result<(), DataRace>
fn rmw_relaxed(
&mut self,
clocks: &ThreadClockSet,
index: VectorIdx
) -> Result<(), DataRace>
Update the memory cell data-race tracking for atomic store relaxed semantics for RMW operations.
sourcefn atomic_read_detect(
&mut self,
clocks: &ThreadClockSet,
index: VectorIdx
) -> Result<(), DataRace>
fn atomic_read_detect(
&mut self,
clocks: &ThreadClockSet,
index: VectorIdx
) -> Result<(), DataRace>
Detect data-races with an atomic read, caused by a non-atomic write that does not happen-before the atomic-read.
sourcefn atomic_write_detect(
&mut self,
clocks: &ThreadClockSet,
index: VectorIdx
) -> Result<(), DataRace>
fn atomic_write_detect(
&mut self,
clocks: &ThreadClockSet,
index: VectorIdx
) -> Result<(), DataRace>
Detect data-races with an atomic write, either with a non-atomic read or with a non-atomic write.
sourcefn read_race_detect(
&mut self,
clocks: &ThreadClockSet,
index: VectorIdx
) -> Result<(), DataRace>
fn read_race_detect(
&mut self,
clocks: &ThreadClockSet,
index: VectorIdx
) -> Result<(), DataRace>
Detect races for non-atomic read operations at the current memory cell returns true if a data-race is detected.
sourcefn write_race_detect(
&mut self,
clocks: &ThreadClockSet,
index: VectorIdx,
write_type: WriteType
) -> Result<(), DataRace>
fn write_race_detect(
&mut self,
clocks: &ThreadClockSet,
index: VectorIdx,
write_type: WriteType
) -> Result<(), DataRace>
Detect races for non-atomic write operations at the current memory cell returns true if a data-race is detected.
Trait Implementations
sourceimpl Clone for MemoryCellClocks
impl Clone for MemoryCellClocks
sourcefn clone(&self) -> MemoryCellClocks
fn clone(&self) -> MemoryCellClocks
1.0.0 · sourcefn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresourceimpl Debug for MemoryCellClocks
impl Debug for MemoryCellClocks
sourceimpl PartialEq<MemoryCellClocks> for MemoryCellClocks
impl PartialEq<MemoryCellClocks> for MemoryCellClocks
sourcefn eq(&self, other: &MemoryCellClocks) -> bool
fn eq(&self, other: &MemoryCellClocks) -> bool
impl Eq for MemoryCellClocks
impl StructuralEq for MemoryCellClocks
impl StructuralPartialEq for MemoryCellClocks
Auto Trait Implementations
impl RefUnwindSafe for MemoryCellClocks
impl Send for MemoryCellClocks
impl Sync for MemoryCellClocks
impl Unpin for MemoryCellClocks
impl UnwindSafe for MemoryCellClocks
Blanket Implementations
sourceimpl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
const: unstable · sourcefn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<V, T> VZip<V> for Twhere
V: MultiLane<T>,
impl<V, T> VZip<V> for Twhere
V: MultiLane<T>,
fn vzip(self) -> V
Layout
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...)
attributes. Please see the Rust Reference’s “Type Layout” chapter for details on type layout guarantees.
Size: 56 bytes