Thread in miri::concurrency::thread - Rust
Description: A thread.

Skip to main content

## Thread

# Struct Thread

Source

    pub struct Thread<'tcx> {
        state: ThreadState<'tcx>,
        thread_name: Option<Vec<u8>>,
        stack: Vec<Frame<'tcx, Provenance, FrameExtra<'tcx>>>,
        pub(crate) origin_span: Span,
        pub(crate) on_stack_empty: Option<StackEmptyCallback<'tcx>>,
        top_user_relevant_frame: Option<usize>,
        join_status: ThreadJoinStatus,
        pub(crate) unwind_payloads: Vec<ImmTy<'tcx>>,
        pub(crate) last_error: Option<MPlaceTy<'tcx>>,
    }

Expand description

A thread.

## Fields§

§`state: ThreadState<'tcx>`§`thread_name: Option<Vec<u8>>`

Name of the thread.

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

The virtual call stack.

§`origin_span: Span`

A span that explains where the thread (or more specifically, its current root frame) “comes from”.

§`on_stack_empty: Option<StackEmptyCallback<'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`. 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.

§`unwind_payloads: Vec<ImmTy<'tcx>>`

Stack of active unwind payloads for the current thread. Used for storing the argument of the call to `miri_start_unwind` (the 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>>`

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

## Implementations§

Source§

### impl<'tcx> Thread<'tcx>

Source

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

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

Source

#### pub fn is_enabled(&self) -> bool

Return whether this thread is enabled or not.

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, skip: usize) -> Option<usize>

Return the top user-relevant frame, if there is one. `skip` indicates how many top frames should be skipped. 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, skip: usize)

Re-compute the top user-relevant frame from scratch. `skip` indicates how many top frames should be skipped.

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_user_relevance(&self) -> u8

Source

#### pub fn current_user_relevant_span(&self) -> Span

Source§

### impl<'tcx> Thread<'tcx>

Source

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

## Trait Implementations§

Source§

### impl<'tcx> Debug for Thread<'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<'tcx> Freeze for Thread<'tcx>

§

### impl<'tcx> !RefUnwindSafe for Thread<'tcx>

§

### impl<'tcx> !Send for Thread<'tcx>

§

### impl<'tcx> !Sync for Thread<'tcx>

§

### impl<'tcx> Unpin for Thread<'tcx>

§

### impl<'tcx> UnsafeUnpin for Thread<'tcx>

§

### impl<'tcx> !UnwindSafe for Thread<'tcx>

## Blanket Implementations§

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> From<T> for T

Source§

#### fn from(t: T) -> T

Returns the argument unchanged.

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<T> Same for T

Source§

#### type Output = T

Should always be `Self`
Source§

### impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

#### 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>,

Source§

#### 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

## 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: 272 bytes