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_payload: Option<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_payload: Option<Scalar<Provenance>>
The temporary 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
.
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>
impl<'mir, 'tcx> Thread<'mir, 'tcx>
sourcefn thread_name(&self) -> &[u8] ⓘ
fn thread_name(&self) -> &[u8] ⓘ
Get the name of the current thread, or <unnamed>
if it was not set.
sourcefn compute_top_user_relevant_frame(&self) -> Option<usize>
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.
sourcepub fn recompute_top_user_relevant_frame(&mut self)
pub fn recompute_top_user_relevant_frame(&mut self)
Re-compute the top user-relevant frame from scratch.
sourcepub fn set_top_user_relevant_frame(&mut self, frame_idx: usize)
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!
sourcepub fn top_user_relevant_frame(&self) -> Option<usize>
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.
Trait Implementations§
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>where
'tcx: 'mir,
impl<'mir, 'tcx> !UnwindSafe for Thread<'mir, 'tcx>
Blanket Implementations§
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