Struct miri::concurrency::sync::RwLock

source ·
struct RwLock {
    writer: Option<ThreadId>,
    readers: FxHashMap<ThreadId, usize>,
    writer_queue: VecDeque<ThreadId>,
    reader_queue: VecDeque<ThreadId>,
    data_race: VClock,
    data_race_reader: VClock,
}
Expand description

The read-write lock state.

Fields§

§writer: Option<ThreadId>

The writer thread that currently owns the lock.

§readers: FxHashMap<ThreadId, usize>

The readers that currently own the lock and how many times they acquired the lock.

§writer_queue: VecDeque<ThreadId>

The queue of writer threads waiting for this lock.

§reader_queue: VecDeque<ThreadId>

The queue of reader threads waiting for this lock.

§data_race: VClock

Data race handle for writers, tracks the happens-before ordering between each write access to a rwlock and is updated after a sequence of concurrent readers to track the happens- before ordering between the set of previous readers and the current writer. Contains the clock of the last thread to release a writer lock or the joined clock of the set of last threads to release shared reader locks.

§data_race_reader: VClock

Data race handle for readers, this is temporary storage for the combined happens-before ordering for between all concurrent readers and the next writer, and the value is stored to the main data_race variable once all readers are finished. Has to be stored separately since reader lock acquires must load the clock of the last write and must not add happens-before orderings between shared reader locks.

Trait Implementations§

source§

impl Debug for RwLock

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for RwLock

source§

fn default() -> RwLock

Returns the “default value” for a type. Read more

Auto Trait Implementations§

§

impl RefUnwindSafe for RwLock

§

impl !Send for RwLock

§

impl !Sync for RwLock

§

impl Unpin for RwLock

§

impl UnwindSafe for RwLock

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for Twhere U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T, U> TryFrom<U> for Twhere U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

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: 232 bytes