Skip to main content

Task

Struct Task 

Source
pub struct Task {
    pub clock: VectorClock,
    pub step_span: Span,
    pub backtrace: Option<Backtrace>,
    pub signature: TaskSignature,
    /* private fields */
}
Expand description

A Task represents a user-level unit of concurrency. Each task has an id that is unique within the execution, and a state reflecting whether the task is runnable (enabled) or not.

Fields§

§clock: VectorClock§step_span: Span§backtrace: Option<Backtrace>

If crate::CAPTURE_BACKTRACE is set then this will be populated on task block. If the test then fails, then each task’s backtrace will be printed.

§signature: TaskSignature

The signature of a Task; this is an identifier that is not guaranteed to be unique but should be mostly stable across iterations in a single Shuttle test. Tasks with the same signature are very likely to exhibit similar behavior

Implementations§

Source§

impl Task

Source

pub fn from_closure( f: Box<dyn FnOnce() + 'static>, stack_size: usize, id: TaskId, name: Option<String>, clock: VectorClock, parent_span_id: Option<Id>, schedule_len: usize, tag: Option<Arc<dyn Tag>>, parent_task_id: Option<TaskId>, signature: TaskSignature, ) -> Self

Source

pub fn from_future<F>( future: F, stack_size: usize, id: TaskId, name: Option<String>, clock: VectorClock, parent_span_id: Option<Id>, schedule_len: usize, tag: Option<Arc<dyn Tag>>, parent_task_id: Option<TaskId>, signature: TaskSignature, ) -> Self
where F: Future<Output = ()> + 'static,

Source

pub fn id(&self) -> TaskId

Returns the identifier of this task.

Source

pub fn parent_task_id(&self) -> Option<TaskId>

Returns the identifier of the task that spawned this task.

Source

pub fn runnable(&self) -> bool

Source

pub fn blocked(&self) -> bool

Source

pub fn can_spuriously_wakeup(&self) -> bool

Source

pub fn sleeping(&self) -> bool

Source

pub fn finished(&self) -> bool

Source

pub fn is_detached(&self) -> bool

Source

pub fn detach(&mut self)

Source

pub fn abort(&mut self)

Wake this task so the Wrapper future can observe the abort flag on its next poll.

Source

pub fn waker(&self) -> Waker

Source

pub fn block(&mut self, allow_spurious_wakeups: bool)

Block the current thread. If allow_spurious_wakeups is true, then the scheduler is permitted to spuriously wake up the thread (though it will still not count as a live thread for deadlock detection purposes for as long as it remains blocked).

Source

pub fn sleep(&mut self)

Source

pub fn unblock(&mut self)

Source

pub fn finish(&mut self)

Source

pub fn sleep_unless_woken(&mut self)

Potentially put this task to sleep after it was polled by the executor, unless someone has called its waker first.

A synchronous Task should never call this, because we want threads to be enabled-by-default to avoid bugs where Shuttle incorrectly omits a potential execution.

Source

pub fn set_waiter(&mut self, waiter: TaskId) -> bool

Register a waiter for this thread to terminate. Returns a boolean indicating whether the waiter should block or not. If false, this task has already finished, and so the waiter need not block.

Source

pub fn take_waiter(&mut self) -> Option<TaskId>

Source

pub fn name(&self) -> Option<String>

Source

pub fn local<T: 'static>( &self, key: &'static LocalKey<T>, ) -> Option<Result<&T, AlreadyDestructedError>>

Retrieve a reference to the given thread-local storage slot.

Returns Some(Err(_)) if the slot has already been destructed. Returns None if the slot has not yet been initialized.

Source

pub fn init_local<T: 'static>(&mut self, key: &'static LocalKey<T>, value: T)

Initialize the given thread-local storage slot with a new value.

Panics if the slot has already been initialized.

Source

pub fn pop_local(&mut self) -> Option<Box<dyn Any>>

Return ownership of the next still-initialized thread-local storage slot, to be used when running thread-local storage destructors.

TLS destructors are a little tricky:

  1. Their code can perform synchronization operations (and so require Shuttle to call back into ExecutionState), so we can’t drop them from within an ExecutionState borrow. Instead we move the contents of a slot to the caller to be dropped outside the borrow.
  2. It’s valid for destructors to read other TLS slots, although destructor order is undefined. This also means it’s valid for a destructor to initialize another TLS slot. To make this work, we run the destructors incrementally, so one destructor can initialize another slot that just gets added via init_local like normal, and then will be available to be popped on a future call to pop_local. To prevent an infinite loop, we forbid reinitializing a TLS slot whose destructor has already run, or is currently being run.
Source

pub fn park(&mut self) -> bool

Park the task if its park token is unavailable. If the task blocks, then it will be woken up when the token becomes available or spuriously without consuming the token (see the documentation for std::thread::park, which says that “it may also return spuriously, without consuming the token”). Returns true if the execution should switch to a different task (e.g., if the token was unavailable).

Source

pub fn unpark(&mut self)

Make the task’s park token available, and unblock the task if it was parked.

Source

pub fn get_tag(&self) -> Option<Arc<dyn Tag>>

Source

pub fn set_tag(&mut self, tag: Arc<dyn Tag>) -> Option<Arc<dyn Tag>>

Sets the tag field of the current task. Returns the tag which was there previously.

Source

pub fn format_for_deadlock(&self) -> String

Trait Implementations§

Source§

impl Debug for Task

Source§

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

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl !Freeze for Task

§

impl !RefUnwindSafe for Task

§

impl !Send for Task

§

impl !Sync for Task

§

impl !UnwindSafe for Task

§

impl Unpin for Task

§

impl UnsafeUnpin for Task

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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. 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<T> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows 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
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows 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
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .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
where Self: BorrowMut<B>, B: ?Sized,

Calls .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
where Self: AsRef<R>, R: ?Sized,

Calls .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
where Self: AsMut<R>, R: ?Sized,

Calls .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
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
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.
Source§

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

Source§

fn vzip(self) -> V

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