Struct miri::concurrency::sync::RwLock
source · struct RwLock {
writer: Option<ThreadId>,
readers: FxHashMap<ThreadId, usize>,
writer_queue: VecDeque<ThreadId>,
reader_queue: VecDeque<ThreadId>,
clock_unlocked: VClock,
clock_current_readers: 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.
clock_unlocked: VClock
Data race clock 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.
clock_current_readers: VClock
Data race clock 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. This is only relevant when there is an active reader.
Trait Implementations§
Auto Trait Implementations§
impl !DynSend for RwLock
impl !DynSync for RwLock
impl Freeze for RwLock
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> 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<T, R> CollectAndApply<T, R> for T
impl<T, R> CollectAndApply<T, R> for T
§impl<T> Filterable for T
impl<T> Filterable for T
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<P> IntoQueryParam<P> for P
impl<P> IntoQueryParam<P> for P
fn into_query_param(self) -> P
source§impl<T> MaybeResult<T> for T
impl<T> MaybeResult<T> for T
§impl<T> Pointable for T
impl<T> Pointable for T
source§impl<'tcx, T> ToPredicate<'tcx, T> for T
impl<'tcx, T> ToPredicate<'tcx, T> for T
fn to_predicate(self, _tcx: TyCtxt<'tcx>) -> T
source§impl<Tcx, T> Value<Tcx> for Twhere
Tcx: DepContext,
impl<Tcx, T> Value<Tcx> for Twhere
Tcx: DepContext,
default fn from_cycle_error( tcx: Tcx, cycle_error: &CycleError, _guar: ErrorGuaranteed ) -> T
source§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
source§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
source§fn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
impl<'a, T> Captures<'a> for Twhere
T: ?Sized,
impl<'a, T> Captures<'a> for Twhere
T: ?Sized,
impl<T> ErasedDestructor for Twhere
T: 'static,
impl<T> MaybeSendSync for T
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