Struct miri::concurrency::thread::Thread

source ·
pub struct Thread<'mir, 'tcx> {
    state: ThreadState,
    thread_name: Option<Vec<u8>>,
    stack: Vec<Frame<'mir, 'tcx, Provenance, FrameExtra<'tcx>>>,
    pub(crate) on_stack_empty: Option<StackEmptyCallback<'mir, 'tcx>>,
    top_user_relevant_frame: Option<usize>,
    join_status: ThreadJoinStatus,
    pub(crate) panic_payloads: Vec<Scalar<Provenance>>,
    pub(crate) last_error: Option<MPlaceTy<'tcx, Provenance>>,
}
Expand description

A thread.

Fields§

§state: ThreadState§thread_name: Option<Vec<u8>>

Name of the thread.

§stack: Vec<Frame<'mir, 'tcx, Provenance, FrameExtra<'tcx>>>

The virtual call stack.

§on_stack_empty: Option<StackEmptyCallback<'mir, 'tcx>>

The function to call when the stack ran empty, to figure out what to do next. Conceptually, this is the interpreter implementation of the things that happen ‘after’ the Rust language entry point for this thread returns (usually implemented by the C or OS runtime). (None is an error, it means the callback has not been set up yet or is actively running.)

§top_user_relevant_frame: Option<usize>

The index of the topmost user-relevant frame in stack. This field must contain the value produced by get_top_user_relevant_frame. The None state here represents This field is a cache to reduce how often we call that method. The cache is manually maintained inside MiriMachine::after_stack_push and MiriMachine::after_stack_pop.

§join_status: ThreadJoinStatus

The join status.

§panic_payloads: Vec<Scalar<Provenance>>

Stack of active panic payloads for the current thread. Used for storing the argument of the call to miri_start_unwind (the panic payload) when unwinding. This is pointer-sized, and matches the Payload type in src/libpanic_unwind/miri.rs.

In real unwinding, the payload gets passed as an argument to the landing pad, which then forwards it to ‘Resume’. However this argument is implicit in MIR, so we have to store it out-of-band. When there are multiple active unwinds, the innermost one is always caught first, so we can store them as a stack.

§last_error: Option<MPlaceTy<'tcx, Provenance>>

Last OS error location in memory. It is a 32-bit integer.

Implementations§

source§

impl<'mir, 'tcx> Thread<'mir, 'tcx>

source

fn thread_name(&self) -> Option<&[u8]>

Get the name of the current thread if it was set.

source

fn thread_display_name(&self, id: ThreadId) -> String

Get the name of the current thread for display purposes; will include thread ID if not set.

source

fn compute_top_user_relevant_frame(&self) -> Option<usize>

Return the top user-relevant frame, if there is one. Note that the choice to return None here when there is no user-relevant frame is part of justifying the optimization that only pushes of user-relevant frames require updating the top_user_relevant_frame field.

source

pub fn recompute_top_user_relevant_frame(&mut self)

Re-compute the top user-relevant frame from scratch.

source

pub fn set_top_user_relevant_frame(&mut self, frame_idx: usize)

Set the top user-relevant frame to the given value. Must be equal to what get_top_user_relevant_frame would return!

source

pub fn top_user_relevant_frame(&self) -> Option<usize>

Returns the topmost frame that is considered user-relevant, or the top of the stack if there is no such frame, or None if the stack is empty.

source

pub fn current_span(&self) -> Span

source§

impl<'mir, 'tcx> Thread<'mir, 'tcx>

source

fn new( name: Option<&str>, on_stack_empty: Option<StackEmptyCallback<'mir, 'tcx>> ) -> Self

Trait Implementations§

source§

impl<'mir, 'tcx> Debug for Thread<'mir, 'tcx>

source§

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

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

impl VisitProvenance for Thread<'_, '_>

source§

fn visit_provenance(&self, visit: &mut VisitWith<'_>)

Auto Trait Implementations§

§

impl<'mir, 'tcx> !DynSend for Thread<'mir, 'tcx>

§

impl<'mir, 'tcx> !DynSync for Thread<'mir, 'tcx>

§

impl<'mir, 'tcx> Freeze for Thread<'mir, 'tcx>

§

impl<'mir, 'tcx> !RefUnwindSafe for Thread<'mir, 'tcx>

§

impl<'mir, 'tcx> !Send for Thread<'mir, 'tcx>

§

impl<'mir, 'tcx> !Sync for Thread<'mir, 'tcx>

§

impl<'mir, 'tcx> Unpin for Thread<'mir, 'tcx>

§

impl<'mir, 'tcx> !UnwindSafe for Thread<'mir, 'tcx>

Blanket Implementations§

source§

impl<T> Aligned for T

source§

const ALIGN: Alignment = _

Alignment of Self.
source§

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

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

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

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

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

source§

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

Mutably borrows from an owned value. Read more
source§

impl<T, R> CollectAndApply<T, R> for T

source§

fn collect_and_apply<I, F>(iter: I, f: F) -> R
where I: Iterator<Item = T>, F: FnOnce(&[T]) -> R,

Equivalent to f(&iter.collect::<Vec<_>>()).

§

type Output = R

§

impl<T> Filterable for T

§

fn filterable( self, filter_name: &'static str ) -> RequestFilterDataProvider<T, fn(_: DataRequest<'_>) -> bool>

Creates a filterable data provider with the given name for debugging. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where 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<P> IntoQueryParam<P> for P

source§

impl<T> MaybeResult<T> for T

§

type Error = !

source§

fn from(_: Result<T, <T as MaybeResult<T>>::Error>) -> T

source§

fn to_result(self) -> Result<T, <T as MaybeResult<T>>::Error>

§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<'tcx, T> ToPredicate<'tcx, T> for T

source§

fn to_predicate(self, _tcx: TyCtxt<'tcx>) -> T

source§

impl<T, U> TryFrom<U> for T
where 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 T
where 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 T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<Tcx, T> Value<Tcx> for T
where Tcx: DepContext,

source§

default fn from_cycle_error( tcx: Tcx, cycle_error: &CycleError, _guar: ErrorGuaranteed ) -> T

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
source§

impl<'a, T> Captures<'a> for T
where T: ?Sized,

source§

impl<'a, T> Captures<'a> for T
where T: ?Sized,

§

impl<T> ErasedDestructor for T
where T: 'static,

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