Struct task::JoinableTaskRef

source ·
pub struct JoinableTaskRef { /* private fields */ }
Expand description

A reference to a Task that can be joined; auto-derefs into TaskRef.

This allows another task to join this task, i.e., wait for this task to finish executing, and to obtain its ExitValue thereafter.

Drop-based Behavior

The contained Task is joinable until this object is dropped. When dropped, this task will be marked as non-joinable and treated as an “orphan” task. This means that there is no way for another task to wait for it to complete or obtain its exit value. As such, this task will be auto-reaped after it exits (in order to avoid zombie tasks).

Not Clone-able

Due to the above drop-based behavior, this type does not implement Clone because it assumes there is only ever one JoinableTaskRef per task.

However, this type auto-derefs into an inner TaskRef, which can be cloned, so you can easily call .clone() on it.

Implementations§

source§

impl JoinableTaskRef

source

pub fn set_waker(&self, waker: Waker)

Sets the waker to be awoken when this task exits.

source

pub fn join(&self) -> Result<ExitValue, &'static str>

Blocks the current task until this task has exited.

Synchronizes memory with respect to the joined task.

Return
  • Ok containing this Task’s ExitValue once this task has exited.
    • This includes cases where this Task failed or was killed.
  • Err if there was a problem while waiting for this task to exit.
    • This does not include cases where this Task failed or was killed, rather only cases where the join operation itself failed.

Methods from Deref<Target = TaskRef>§

source

pub fn downgrade(&self) -> WeakTaskRef

Creates a new weak reference to this Task, similar to Weak.

source

pub fn is_joinable(&self) -> bool

Returns true if this task is joinable, false if not.

  • If true, another task holds the JoinableTaskRef object that was created by TaskRef::create(), which indicates that that other task is able to wait for this task to exit and thus be able to obtain this task’s exit value.
  • If false, the JoinableTaskRef object was dropped, and therefore no other task can join this task or obtain its exit value.

When a task is not joinable, it is considered to be an orphan and will thus be automatically reaped and cleaned up once it exits because no other task is waiting on it to exit.

source

pub fn kill(&self, reason: KillReason) -> Result<(), &'static str>

Kills this Task (not a clean exit) without allowing it to run to completion. The provided KillReason indicates why it was killed.

** Currently this immediately kills the task without performing any unwinding cleanup. In the near future, the task will be unwound such that its resources are freed/dropped to ensure proper cleanup before the task is actually fully killed. **

Locking / Deadlock

This method obtains a writable lock on the underlying Task’s inner state.

Return
  • Returns Ok if the exit status was successfully set to the given KillReason.
  • Returns Err if this Task was already exited, and does not overwrite the existing exit status.
Note

The Task will not be halted immediately – it will finish running its current timeslice, and then never be run again.

Methods from Deref<Target = Task>§

pub fn set_env(&self, new_env: Arc<Mutex<Environment, Spin>, Global>)

Sets the Environment of this Task.

Locking / Deadlock

Obtains the lock on this Task’s inner state in order to mutate it.

pub fn get_env(&self) -> Arc<Mutex<Environment, Spin>, Global>

Gets a reference to this task’s Environment.

Locking / Deadlock

Obtains the lock on this Task’s inner state in order to access it.

pub fn is_running(&self) -> bool

Returns true if this Task is currently running.

pub fn running_on_cpu(&self) -> Option<CpuId>

Returns the ID of the CPU this Task is currently running on.

pub fn pinned_cpu(&self) -> Option<CpuId>

Returns the ID of the CPU this Task is pinned on, or None if it is not pinned.

pub fn runstate(&self) -> RunState

Returns the current RunState of this Task.

pub fn is_runnable(&self) -> bool

Returns whether this Task is runnable, i.e., able to be scheduled in.

For this to return true, this Task’s runstate must be Runnable and it must not be suspended.

Note

This does NOT mean that this Task is actually currently running, just that it is able to be run.

pub fn get_namespace(&self) -> &Arc<CrateNamespace, Global>

Returns the namespace that this Task is loaded/linked into and runs within.

pub fn with_kstack<R, F>(&self, func: F) -> Rwhere F: FnOnce(&Stack) -> R,

Exposes read-only access to this Task’s [Stack] by invoking the given func with a reference to its kernel stack.

Locking / Deadlock

Obtains the lock on this Task’s inner state for the duration of func in order to access its stack. The given func must not attempt to obtain that same inner lock.

pub fn with_restart_info<R, F>(&self, func: F) -> Rwhere F: FnOnce(Option<&RestartInfo>) -> R,

Invokes func with immutable access to this Task’s RestartInfo.

Locking / Deadlock

Obtains the lock on this Task’s inner state for the duration of func in order to access its stack. The given func must not attempt to obtain that same inner lock.

pub fn has_exited(&self) -> bool

Returns true if this Task has been exited, i.e., if its RunState is either Exited or Reaped.

pub fn is_application(&self) -> bool

Returns true if this is an application Task.

This will also return true if this task was spawned by an application task, since a task inherits the “application crate” field from its “parent” that spawned it.

pub fn is_restartable(&self) -> bool

Returns true if this Task was spawned as a restartable task.

Locking / Deadlock

Obtains the lock on this Task’s inner state in order to access it.

pub fn block(&self) -> Result<RunState, RunState>

Blocks this Task by setting its runstate to RunState::Blocked.

Returns the previous runstate on success, and the current runstate on error. This will only succeed if the task is runnable or already blocked.

pub fn block_initing_task(&self) -> Result<RunState, RunState>

Blocks this Task if it is a newly-spawned task currently being initialized.

This is a special case only to be used when spawning a new task that should not be immediately scheduled in; it will fail for all other cases.

Returns the previous runstate (i.e. RunState::Initing) on success, or the current runstate on error.

pub fn unblock(&self) -> Result<RunState, RunState>

Unblocks this Task by setting its runstate to RunState::Runnable.

Returns the previous runstate on success, and the current runstate on error. Will only succed if the task is blocked or already runnable.

pub fn make_inited_task_runnable(&self) -> Result<RunState, RunState>

Makes this Task Runnable if it is a newly-spawned and fully initialized task.

This is a special case only to be used when spawning a new task that is ready to be scheduled in; it will fail for all other cases.

Returns the previous runstate (i.e. RunState::Initing) on success, and the current runstate on error.

pub fn suspend(&self)

Suspends this Task.

pub fn unsuspend(&self)

Unsuspends this Task.

pub fn is_suspended(&self) -> bool

Returns true if this Task is suspended.

Note that a task being suspended is independent from its RunState.

Trait Implementations§

source§

impl Debug for JoinableTaskRef

source§

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

Formats the value using the given formatter. Read more
source§

impl Deref for JoinableTaskRef

§

type Target = TaskRef

The resulting type after dereferencing.
source§

fn deref(&self) -> &Self::Target

Dereferences the value.
source§

impl Drop for JoinableTaskRef

source§

fn drop(&mut self)

Marks the inner Task as not joinable, meaning that it is an orphaned task that will be auto-reaped after exiting.

Auto Trait Implementations§

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.