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_panic (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) -> &[u8]

Get the name of the current thread, or <unnamed> if it was 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§

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 VisitTags for Thread<'_, '_>

source§

fn visit_tags(&self, visit: &mut dyn FnMut(BorTag))

Auto Trait Implementations§

§

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