Struct miri::alloc_addresses::reuse_pool::ReusePool
source · pub struct ReusePool {
pool: Vec<Vec<(u64, Size)>>,
}
Expand description
The pool strikes a balance between exploring more possible executions and making it more likely to find bugs. The hypothesis is that bugs are more likely to occur when reuse happens for allocations with the same layout, since that can trigger e.g. ABA issues in a concurrent data structure. Therefore we only reuse allocations when size and alignment match exactly.
Fields§
§pool: Vec<Vec<(u64, Size)>>
The i-th element in pool
stores allocations of alignment 2^i
. We store these reusable
allocations as address-size pairs, the list must be sorted by the size.
Each of these maps has at most MAX_POOL_SIZE elements, and since alignment is limited to less than 64 different possible value, that bounds the overall size of the pool.
Implementations§
Trait Implementations§
Auto Trait Implementations§
impl DynSend for ReusePool
impl DynSync for ReusePool
impl Freeze for ReusePool
impl RefUnwindSafe for ReusePool
impl Send for ReusePool
impl Sync for ReusePool
impl Unpin for ReusePool
impl UnwindSafe for ReusePool
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: 24 bytes