pub struct Task {
pub id: usize,
pub name: String,
pub mmi: Arc<Mutex<MemoryManagementInfo, DisableIrq>, Global>,
pub is_an_idle_task: bool,
pub app_crate: Option<Arc<AppCrateRef, Global>>,
pub namespace: Arc<CrateNamespace, Global>,
/* private fields */
}
Expand description
A structure that contains contextual information for a thread of execution.
Implementation note
Only fields that do not permit interior mutability can safely be exposed as public because we allow foreign crates to directly access task struct fields.
Fields§
§id: usize
The unique identifier of this Task.
name: String
The simple name of this Task.
mmi: Arc<Mutex<MemoryManagementInfo, DisableIrq>, Global>
Memory management details: page tables, mappings, allocators, etc. This is shared among all other tasks in the same address space.
is_an_idle_task: bool
Whether this Task is an idle task, the task that runs by default when no other task is running.
There exists one idle task per core, so this is false
for most tasks.
app_crate: Option<Arc<AppCrateRef, Global>>
For application Task
s, this is effectively a reference to the [mod_mgmt::LoadedCrate
]
that contains the entry function for this Task
.
namespace: Arc<CrateNamespace, Global>
This Task
is linked into and runs within the context of this [CrateNamespace
].
Implementations§
§impl Task
impl Task
pub fn new(
stack: Option<Stack>,
states_to_inherit: InheritedStates<'_>
) -> Result<Task, &'static str>
pub fn new( stack: Option<Stack>, states_to_inherit: InheritedStates<'_> ) -> Result<Task, &'static str>
Creates a new Task
and initializes it to be non-Runnable
.
Arguments
stack
: the optionalStack
for this newTask
to use.- If
None
, a stack of the default size will be allocated and used.
- If
inherited states
: the set of states used to initialize this newTask
.- Typically, a caller will pass in
InheritedStates::FromTask
with the enclosed task being a reference to the current task. In this way, the enclosed task acts as a sort of “parent” template for this newTask
. Theseus doesn’t have a true parent-child relationship between tasks; the newTask
merely inherits select states from it.
- Typically, a caller will pass in
Usage Notes
- This does not run the task, schedule it in, or switch to it.
- If you want to create a new task, you should use the
spawn
crate instead.
pub fn set_env(&self, new_env: Arc<Mutex<Environment, Spin>, Global>)
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>
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
pub fn is_running(&self) -> bool
Returns true
if this Task
is currently running.
pub fn running_on_cpu(&self) -> Option<CpuId>
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>
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 is_runnable(&self) -> bool
pub fn is_runnable(&self) -> bool
pub fn get_namespace(&self) -> &Arc<CrateNamespace, Global>
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,
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 inner_mut(&mut self) -> &mut TaskInner
pub fn inner_mut(&mut self) -> &mut TaskInner
Returns a mutable reference to this Task
’s inner state.
Note about mutability
This function requires the caller to have a mutable reference to this Task
in order to protect the inner state from foreign crates accessing it
through a TaskRef
auto-dereferencing into a Task
.
This is because you can only obtain a mutable reference to a Task
before you enclose it in a TaskRef
wrapper type.
Because this function requires a mutable reference to this Task
,
no locks must be obtained.
pub fn with_restart_info<R, F>(&self, func: F) -> Rwhere
F: FnOnce(Option<&RestartInfo>) -> R,
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
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
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
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>
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>
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>
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>
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)
pub fn suspend(&self)
Suspends this Task
.
pub fn unsuspend(&self)
pub fn unsuspend(&self)
Unsuspends this Task
.
pub fn is_suspended(&self) -> bool
pub fn is_suspended(&self) -> bool
Returns true
if this Task
is suspended.
Note that a task being suspended is independent from its RunState
.