pub struct ExecutionState {
pub config: Config,
pub steps_reset_at: usize,
pub top_level_span: Span,
/* private fields */
}Expand description
ExecutionState contains the portion of a single execution’s state that needs to be reachable
from within a task’s execution. It tracks which tasks exist and their states, as well as which
tasks are pending spawn.
Fields§
§config: Config§steps_reset_at: usize§top_level_span: SpanImplementations§
Source§impl ExecutionState
impl ExecutionState
Sourcepub fn with<F, T>(f: F) -> Twhere
F: FnOnce(&mut ExecutionState) -> T,
pub fn with<F, T>(f: F) -> Twhere
F: FnOnce(&mut ExecutionState) -> T,
Invoke a closure with access to the current execution state. Library code uses this to gain access to the state of the execution to influence scheduling (e.g. to register a task as blocked).
Sourcepub fn try_with<F, T>(f: F) -> Result<T, ExecutionStateBorrowError>where
F: FnOnce(&mut ExecutionState) -> T,
pub fn try_with<F, T>(f: F) -> Result<T, ExecutionStateBorrowError>where
F: FnOnce(&mut ExecutionState) -> T,
Like with, but returns None instead of panicking if there is no current ExecutionState or
if the current ExecutionState is already borrowed.
Sourcepub fn exit_current_truncates_execution(&self) -> bool
pub fn exit_current_truncates_execution(&self) -> bool
If there is only one attached, unfinished task and there is at least one detached, unfinished task then exiting the attached task will cause the whole execution to exit. As a result, the unfinished detached tasks are truncated – their remaining events will not be executed because the program itself has exited. This is relevant because it means that exiting a task can be a visible operation in that it affects which events are executed.
pub fn spawn_main_thread( f: Box<dyn FnOnce() + 'static>, stack_size: usize, caller: &'static Location<'static>, ) -> TaskId
Sourcepub fn spawn_future<F>(
future: F,
stack_size: usize,
name: Option<String>,
caller: &'static Location<'static>,
) -> TaskId
pub fn spawn_future<F>( future: F, stack_size: usize, name: Option<String>, caller: &'static Location<'static>, ) -> TaskId
Spawn a new task for a future. This doesn’t create a yield point; the caller should do that if it wants to give the new task a chance to run immediately.
pub fn spawn_thread( f: Box<dyn FnOnce() + 'static>, stack_size: usize, name: Option<String>, initial_clock: Option<VectorClock>, caller: &'static Location<'static>, ) -> TaskId
Sourcepub fn is_finished(&self) -> bool
pub fn is_finished(&self) -> bool
Determine whether the execution has finished.
Sourcepub fn maybe_yield() -> bool
pub fn maybe_yield() -> bool
Invoke the scheduler to decide which task to schedule next. Returns true if the chosen task is different from the currently running task, indicating that the current task should yield its execution.
Sourcepub fn request_yield()
pub fn request_yield()
Tell the scheduler that the next context switch is an explicit yield requested by the current task. Some schedulers use this as a hint to influence scheduling.
Sourcepub fn should_stop() -> bool
pub fn should_stop() -> bool
Check whether the current execution has stopped. Call from Drop handlers to early exit if
they are being invoked because an execution has stopped.
We also stop if we are currently panicking (e.g., perhaps we’re unwinding the stack for a panic triggered while someone held a Mutex, and so are executing the Drop handler for MutexGuard). This avoids calling back into the scheduler during a panic, because the state may be poisoned or otherwise invalid.
Sourcepub fn failing_task() -> String
pub fn failing_task() -> String
Generate some diagnostic information used when persisting failures.
Because this method may be called from a panic hook, it must not panic.
pub fn current(&self) -> &Task
pub fn current_mut(&mut self) -> &mut Task
pub fn try_current(&self) -> Option<&Task>
pub fn get(&self, id: TaskId) -> &Task
pub fn get_mut(&mut self, id: TaskId) -> &mut Task
pub fn try_get(&self, id: TaskId) -> Option<&Task>
pub fn in_cleanup(&self) -> bool
pub fn context_switches() -> usize
pub fn new_resource_signature(resource_type: ResourceType) -> ResourceSignature
pub fn get_storage<K: Into<StorageKey>, T: 'static>(&self, key: K) -> Option<&T>
pub fn init_storage<K: Into<StorageKey>, T: 'static>( &mut self, key: K, value: T, )
pub fn get_clock(&self, id: TaskId) -> &VectorClock
pub fn get_clock_mut(&mut self, id: TaskId) -> &mut VectorClock
Sourcepub fn update_clock(&mut self, clock: &VectorClock)
pub fn update_clock(&mut self, clock: &VectorClock)
Increment the current thread’s clock entry and update its clock with the one provided.
Sourcepub fn increment_clock(&mut self) -> &VectorClock
pub fn increment_clock(&mut self) -> &VectorClock
Increment the current thread’s clock and return a shared reference to it
Sourcepub fn increment_clock_mut(&mut self) -> &mut VectorClock
pub fn increment_clock_mut(&mut self) -> &mut VectorClock
Increment the current thread’s clock and return a mutable reference to it
pub fn set_tag_for_current_task(tag: Arc<dyn Tag>) -> Option<Arc<dyn Tag>>
pub fn get_tag_for_current_task() -> Option<Arc<dyn Tag>>
pub fn set_tag_for_task(task: TaskId, tag: Arc<dyn Tag>) -> Option<Arc<dyn Tag>>
Trait Implementations§
Source§impl Debug for ExecutionState
impl Debug for ExecutionState
Source§impl Drop for ExecutionState
Available on debug-assertions enabled only.
impl Drop for ExecutionState
Auto Trait Implementations§
impl !Freeze for ExecutionState
impl !RefUnwindSafe for ExecutionState
impl !Send for ExecutionState
impl !Sync for ExecutionState
impl !UnwindSafe for ExecutionState
impl Unpin for ExecutionState
impl UnsafeUnpin for ExecutionState
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.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<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.