Task

Struct Task 

Source
pub struct Task {
Show 15 fields pub weak_self: WeakRef<Self>, pub tid: tid_t, pub thread_group_key: ThreadGroupKey, pub kernel: Arc<Kernel>, pub thread_group: Arc<ThreadGroup>, pub thread: RwLock<Option<Arc<Thread>>>, pub files: FdTable, pub mm: RcuOptionArc<MemoryManager>, pub abstract_socket_namespace: Arc<AbstractUnixSocketNamespace>, pub abstract_vsock_namespace: Arc<AbstractVsockSocketNamespace>, pub persistent_info: TaskPersistentInfo, pub seccomp_filter_state: SeccompState, pub trace_syscalls: AtomicBool, pub proc_pid_directory_cache: Mutex<Option<FsNodeHandle>>, pub security_state: TaskState, /* private fields */
}
Expand description

A unit of execution.

A task is the primary unit of execution in the Starnix kernel. Most tasks are user tasks, which have an associated Zircon thread. The Zircon thread switches between restricted mode, in which the thread runs userspace code, and normal mode, in which the thread runs Starnix code.

Tasks track the resources used by userspace by referencing various objects, such as an FdTable, a MemoryManager, and an FsContext. Many tasks can share references to these objects. In principle, which objects are shared between which tasks can be largely arbitrary, but there are common patterns of sharing. For example, tasks created with pthread_create will share the FdTable, MemoryManager, and FsContext and are often called “threads” by userspace programmers. Tasks created by posix_spawn do not share these objects and are often called “processes” by userspace programmers. However, inside the kernel, there is no clear definition of a “thread” or a “process”.

During boot, the kernel creates the first task, often called init. The vast majority of other tasks are created as transitive clones (e.g., using clone(2)) of that task. Sometimes, the kernel will create new tasks from whole cloth, either with a corresponding userspace component or to represent some background work inside the kernel.

See also CurrentTask, which represents the task corresponding to the thread that is currently executing.

Fields§

§weak_self: WeakRef<Self>

Weak reference to the OwnedRef of this Task. This allows to retrieve the TempRef from a raw Task.

§tid: tid_t

A unique identifier for this task.

This value can be read in userspace using gettid(2). In general, this value is different from the value return by getpid(2), which returns the id of the leader of the thread_group.

§thread_group_key: ThreadGroupKey

The process key of this task.

§kernel: Arc<Kernel>

The kernel to which this thread group belongs.

§thread_group: Arc<ThreadGroup>

The thread group to which this task belongs.

The group of tasks in a thread group roughly corresponds to the userspace notion of a process.

§thread: RwLock<Option<Arc<Thread>>>

A handle to the underlying Zircon thread object.

Some tasks lack an underlying Zircon thread. These tasks are used internally by the Starnix kernel to track background work, typically on a kthread.

§files: FdTable

The file descriptor table for this task.

This table can be share by many tasks.

§mm: RcuOptionArc<MemoryManager>

The memory manager for this task. This is None only for system tasks.

§abstract_socket_namespace: Arc<AbstractUnixSocketNamespace>

The namespace for abstract AF_UNIX sockets for this task.

§abstract_vsock_namespace: Arc<AbstractVsockSocketNamespace>

The namespace for AF_VSOCK for this task.

§persistent_info: TaskPersistentInfo

The information of the task that needs to be available to the ThreadGroup while computing which process a wait can target. Contains the command line, the task credentials and the exit signal. See TaskPersistentInfo for more information.

§seccomp_filter_state: SeccompState

Variable that can tell you whether there are currently seccomp filters without holding a lock

§trace_syscalls: AtomicBool

Tell you whether you are tracing syscall entry / exit without a lock.

§proc_pid_directory_cache: Mutex<Option<FsNodeHandle>>§security_state: TaskState

The Linux Security Modules state for this thread group. This should be the last member of this struct.

Implementations§

Source§

impl Task

Source

pub fn kernel(&self) -> &Arc<Kernel>

Source

pub fn thread_group(&self) -> &Arc<ThreadGroup>

Source

pub fn has_same_address_space(&self, other: Option<&Arc<MemoryManager>>) -> bool

Source

pub fn flags(&self) -> TaskFlags

Source

pub fn set_ptrace_zombie(&self, pids: &mut PidTable)

When the task exits, if there is a notification that needs to propagate to a ptracer, make sure it will propagate.

Source

pub fn ptrace_disconnect(&mut self, pids: &PidTable)

Disconnects this task from the tracer, if the tracer is still running.

Source

pub fn exit_status(&self) -> Option<ExitStatus>

Source

pub fn is_exitted(&self) -> bool

Source

pub fn load_stopped(&self) -> StopState

Source

pub fn from_weak(weak: &WeakRef<Task>) -> Result<TempRef<'_, Task>, Errno>

Upgrade a Reference to a Task, returning a ESRCH errno if the reference cannot be borrowed.

Source

pub fn new( tid: tid_t, command: TaskCommand, thread_group: Arc<ThreadGroup>, thread: Option<Thread>, files: FdTable, mm: Option<Arc<MemoryManager>>, fs: Arc<FsContext>, creds: Credentials, abstract_socket_namespace: Arc<AbstractUnixSocketNamespace>, abstract_vsock_namespace: Arc<AbstractVsockSocketNamespace>, signal_mask: SigSet, kernel_signals: VecDeque<KernelSignal>, vfork_event: Option<Arc<Event>>, scheduler_state: SchedulerState, uts_ns: UtsNamespaceHandle, no_new_privs: bool, seccomp_filter_state: SeccompState, seccomp_filters: SeccompFilterContainer, robust_list_head: RobustListHeadPtr, timerslack_ns: u64, security_state: TaskState, ) -> OwnedRef<Self>

Internal function for creating a Task object. Useful when you need to specify the value of every field. create_process and create_thread are more likely to be what you want.

Any fields that should be initialized fresh for every task, even if the task was created with fork, are initialized to their defaults inside this function. All other fields are passed as parameters.

Source

pub fn read<'a>(self: &'a Task) -> TaskReadGuard<'a>

Source

pub fn write<'a>(self: &'a Task) -> TaskWriteGuard<'a>

Source

pub fn add_file<L>( &self, locked: &mut Locked<L>, file: FileHandle, flags: FdFlags, ) -> Result<FdNumber, Errno>

Source

pub fn real_creds(&self) -> Credentials

Returns the real credentials of the task. These credentials are used to check permissions for actions performed on the task. If the task itself is performing an action, use CurrentTask::current_creds instead.

Source

pub fn with_real_creds<B, F>(&self, f: F) -> B
where F: FnOnce(&Credentials) -> B,

Source

pub fn ptracer_task(&self) -> WeakRef<Task>

Source

pub fn fs(&self) -> Arc<FsContext>

Source

pub fn has_shared_fs(&self) -> bool

Source

pub fn mm(&self) -> Result<Arc<MemoryManager>, Errno>

Source

pub fn unshare_fs(&self)

Source

pub fn set_scheduler_state( &self, scheduler_state: SchedulerState, ) -> Result<(), Errno>

Overwrite the existing scheduler state with a new one and update the task’s thread’s role.

Source

pub fn sync_scheduler_state_to_role(&self) -> Result<(), Errno>

Update the task’s thread’s role based on its current scheduler state without making any changes to the state.

This should be called on tasks that have newly created threads, e.g. after cloning.

Source

pub fn signal_vfork(&self)

Signals the vfork event, if any, to unblock waiters.

Source

pub fn wait_for_execve(&self, task_to_wait: WeakRef<Task>) -> Result<(), Errno>

Blocks the caller until the task has exited or executed execve(). This is used to implement vfork() and clone(… CLONE_VFORK, …). The task must have created with CLONE_EXECVE.

Source

pub fn clear_child_tid_if_needed<L>( &self, locked: &mut Locked<L>, ) -> Result<(), Errno>

If needed, clear the child tid for this task.

Userspace can ask us to clear the child tid and issue a futex wake at the child tid address when we tear down a task. For example, bionic uses this mechanism to implement pthread_join. The thread that calls pthread_join sleeps using FUTEX_WAIT on the child tid address. We wake them up here to let them know the thread is done.

Source

pub fn get_task(&self, tid: tid_t) -> WeakRef<Task>

Source

pub fn get_pid(&self) -> pid_t

Source

pub fn get_tid(&self) -> tid_t

Source

pub fn is_leader(&self) -> bool

Source

pub fn read_argv(&self, max_len: usize) -> Result<Vec<FsString>, Errno>

Source

pub fn read_argv0(&self) -> Result<FsString, Errno>

Source

pub fn read_env(&self, max_len: usize) -> Result<Vec<FsString>, Errno>

Source

pub fn thread_runtime_info(&self) -> Result<TaskRuntimeInfo, Errno>

Source

pub fn real_fscred(&self) -> FsCred

Source

pub fn interrupt(&self)

Interrupts the current task.

This will interrupt any blocking syscalls if the task is blocked on one. The signal_state of the task must not be locked.

Source

pub fn command(&self) -> TaskCommand

Source

pub fn set_command_name(&self, new_name: TaskCommand)

Source

pub fn set_seccomp_state(&self, state: SeccompStateValue) -> Result<(), Errno>

Source

pub fn state_code(&self) -> TaskStateCode

Source

pub fn time_stats(&self) -> TaskTimeStats

Source

pub fn get_signal_action(&self, signal: Signal) -> sigaction_t

Source

pub fn record_pid_koid_mapping(&self)

Trait Implementations§

Source§

impl Debug for Task

Source§

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

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

impl<'a> From<&'a Task> for Auditable<'a>

Source§

fn from(value: &'a Task) -> Self

Converts to this type from the input type.
Source§

impl MemoryAccessor for Task

Source§

fn read_memory<'a>( &self, addr: UserAddress, bytes: &'a mut [MaybeUninit<u8>], ) -> Result<&'a mut [u8], Errno>

Reads exactly bytes.len() bytes of memory from addr into bytes. Read more
Source§

fn read_memory_partial_until_null_byte<'a>( &self, addr: UserAddress, bytes: &'a mut [MaybeUninit<u8>], ) -> Result<&'a mut [u8], Errno>

Reads bytes starting at addr, continuing until either a null byte is read, bytes.len() bytes have been read or no more bytes can be read from the target. Read more
Source§

fn read_memory_partial<'a>( &self, addr: UserAddress, bytes: &'a mut [MaybeUninit<u8>], ) -> Result<&'a mut [u8], Errno>

Reads bytes starting at addr, continuing until either bytes.len() bytes have been read or no more bytes can be read from the target. Read more
Source§

fn write_memory(&self, addr: UserAddress, bytes: &[u8]) -> Result<usize, Errno>

Writes the provided bytes to addr. Read more
Source§

fn write_memory_partial( &self, addr: UserAddress, bytes: &[u8], ) -> Result<usize, Errno>

Writes bytes starting at addr, continuing until either bytes.len() bytes have been written or no more bytes can be written. Read more
Source§

fn zero(&self, addr: UserAddress, length: usize) -> Result<usize, Errno>

Writes zeros starting at addr and continuing for length bytes. Read more
Source§

impl PartialEq for Task

Source§

fn eq(&self, other: &Self) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Releasable for Task

Source§

type Context<'a> = (Box<ThreadState>, &'a mut Locked<TaskRelease>, RwLockWriteGuard<'a, RawSyncRwLock, PidTable>)

Source§

fn release<'a>(self, context: Self::Context<'a>)

Source§

impl TaskMemoryAccessor for Task

Source§

fn maximum_valid_address(&self) -> Option<UserAddress>

Returns the maximum valid address for this memory accessor.
Source§

impl Eq for Task

Auto Trait Implementations§

§

impl !Freeze for Task

§

impl !RefUnwindSafe for Task

§

impl Send for Task

§

impl Sync for Task

§

impl Unpin for Task

§

impl !UnwindSafe 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> AsAny for T
where T: Any,

Source§

fn as_any(&self) -> &(dyn Any + 'static)

Source§

fn type_name(&self) -> &'static str

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<T, D> Encode<Ambiguous1, D> for T
where D: ResourceDialect,

Source§

unsafe fn encode( self, _encoder: &mut Encoder<'_, D>, _offset: usize, _depth: Depth, ) -> Result<(), Error>

Encodes the object into the encoder’s buffers. Any handles stored in the object are swapped for Handle::INVALID. Read more
Source§

impl<T, D> Encode<Ambiguous2, D> for T
where D: ResourceDialect,

Source§

unsafe fn encode( self, _encoder: &mut Encoder<'_, D>, _offset: usize, _depth: Depth, ) -> Result<(), Error>

Encodes the object into the encoder’s buffers. Any handles stored in the object are swapped for Handle::INVALID. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> InstanceFromServiceTransport<T> for T

§

fn from_service_transport(handle: T) -> T

Converts the given service transport handle of type T to [Self]
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, U> Into32<U> for T
where U: MultiArchFrom<T>,

Source§

fn into_32(self) -> U

Source§

impl<T, U> Into64<U> for T
where U: MultiArchFrom<T>,

Source§

fn into_64(self) -> U

Source§

impl<T> IntoAny for T
where T: 'static + Send + Sync,

Source§

fn into_any(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Cast the given object into a dyn std::any::Any.
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T, U> IntoExt<U> for T
where U: FromExt<T>,

§

fn into_ext(self) -> U

Performs the conversion.
Source§

impl<T, U> IntoFidl<U> for T
where U: FromFidl<T>,

Source§

fn into_fidl(self) -> U

Source§

impl<T> MemoryAccessorExt for T
where T: MemoryAccessor,

Source§

fn read_memory_to_slice( &self, addr: UserAddress, bytes: &mut [u8], ) -> Result<(), Errno>

Reads exactly bytes.len() bytes of memory from addr into bytes. Read more
Source§

fn read_memory_to_vec( &self, addr: UserAddress, len: usize, ) -> Result<Vec<u8>, Errno>

Read exactly len bytes of memory, returning them as a a Vec.
Source§

fn read_memory_partial_to_vec( &self, addr: UserAddress, max_len: usize, ) -> Result<Vec<u8>, Errno>

Read up to max_len bytes from addr, returning them as a Vec.
Source§

fn read_memory_to_array<const N: usize>( &self, addr: UserAddress, ) -> Result<[u8; N], Errno>

Read exactly N bytes from addr, returning them as an array.
Source§

fn read_buffer(&self, buffer: &UserBuffer) -> Result<Vec<u8>, Errno>

Read the contents of buffer, returning them as a Vec.
Source§

fn read_object<T: FromBytes>(&self, user: UserRef<T>) -> Result<T, Errno>

Read an instance of T from user.
Source§

fn read_multi_arch_ptr<T64, T32>( &self, user: MultiArchUserRef<MultiArchUserRef<T64, T32>, MultiArchUserRef<T64, T32>>, ) -> Result<MultiArchUserRef<T64, T32>, Errno>

Source§

fn read_multi_arch_object<T, T64: FromBytes + TryInto<T>, T32: FromBytes + TryInto<T>>( &self, user: MappingMultiArchUserRef<T, T64, T32>, ) -> Result<T, Errno>

Read an instance of T64 from user where the object has a different representation in 32 and 64 bits.
Source§

fn read_multi_arch_objects_to_vec<T, T64: FromBytes + TryInto<T>, T32: FromBytes + TryInto<T>>( &self, user: MappingMultiArchUserRef<T, T64, T32>, len: usize, ) -> Result<Vec<T>, Errno>

Read exactly len objects from user, returning them as a Vec.
Source§

fn read_object_partial<T: FromBytes>( &self, user: UserRef<T>, partial_size: usize, ) -> Result<T, Errno>

Reads the first partial bytes of an object, leaving any remainder 0-filled. Read more
Source§

fn read_objects<'a, T: FromBytes>( &self, user: UserRef<T>, objects: &'a mut [MaybeUninit<T>], ) -> Result<&'a mut [T], Errno>

Read exactly objects.len() objects into objects from user.
Source§

fn read_objects_to_slice<T: FromBytes>( &self, user: UserRef<T>, objects: &mut [T], ) -> Result<(), Errno>

Read exactly objects.len() objects into objects from user.
Source§

fn read_objects_to_vec<T: FromBytes>( &self, user: UserRef<T>, len: usize, ) -> Result<Vec<T>, Errno>

Read exactly len objects from user, returning them as a Vec.
Source§

fn read_objects_to_smallvec<T: Clone + FromBytes, const N: usize>( &self, user: UserRef<T>, len: usize, ) -> Result<SmallVec<[T; N]>, Errno>

Read exactly len objects from user, returning them as a SmallVec.
Source§

fn read_objects_to_array<T: Copy + FromBytes, const N: usize>( &self, user: UserRef<T>, ) -> Result<[T; N], Errno>

Read exactly N objects from user, returning them as an array.
Source§

fn read_iovec<T: Copy + Eq + IntoBytes + FromBytes + Immutable + TryInto<usize>>( &self, iovec_addr: IOVecPtr, iovec_count: UserValue<T>, ) -> Result<UserBuffers, Errno>

Read exactly iovec_count UserBuffers from iovec_addr. Read more
Source§

fn read_c_string_to_vec( &self, string: UserCString, max_size: usize, ) -> Result<FsString, Errno>

Read up to max_size bytes from string, stopping at the first discovered null byte and returning the results as a Vec.
Source§

fn read_path(&self, path: UserCString) -> Result<FsString, Errno>

Read a path from path, returning it as a FsString. Read more
Source§

fn read_path_if_non_null(&self, path: UserCString) -> Result<FsString, Errno>

Read a path from path, returning it as a FsString, if the path is non-null. Read more
Source§

fn read_nul_delimited_c_string_list( &self, start: UserAddress, len: usize, ) -> Result<Vec<FsString>, Errno>

Read len bytes from start and parse the region as null-delimited CStrings, for example how argv is stored. Read more
Source§

fn read_c_string<'a>( &self, string: UserCString, buffer: &'a mut [MaybeUninit<u8>], ) -> Result<&'a FsStr, Errno>

Read up to buffer.len() bytes from string, stopping at the first discovered null byte and returning the result as a slice that ends before that null. Read more
Source§

fn read_c_string_if_non_null<'a>( &self, addr: UserCString, buffer: &'a mut [MaybeUninit<u8>], ) -> Result<&'a FsStr, Errno>

Returns a default initialized string if addr is null, otherwise behaves as read_c_string.
Source§

fn write_object<T: IntoBytes + Immutable>( &self, user: UserRef<T>, object: &T, ) -> Result<usize, Errno>

Source§

fn write_objects<T: IntoBytes + Immutable>( &self, user: UserRef<T>, objects: &[T], ) -> Result<usize, Errno>

Source§

fn write_multi_arch_ptr<Addr, T64, T32>( &self, user: Addr, object: MultiArchUserRef<T64, T32>, ) -> Result<usize, Errno>
where Addr: Into<UserAddress>,

Source§

fn write_multi_arch_object<T, T64: IntoBytes + Immutable + TryFrom<T>, T32: IntoBytes + Immutable + TryFrom<T>>( &self, user: MappingMultiArchUserRef<T, T64, T32>, object: T, ) -> Result<usize, Errno>

Source§

impl<T, U> MultiArchFrom<T> for U
where U: From<T>,

Source§

fn from_64(value: T) -> U

Source§

fn from_32(value: T) -> U

§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
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.
§

impl<T, U> TryIntoExt<U> for T
where U: TryFromExt<T>,

§

type Error = <U as TryFromExt<T>>::Error

§

fn try_into_ext(self) -> Result<U, <T as TryIntoExt<U>>::Error>

Tries to perform the conversion.
§

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

§

fn vzip(self) -> V

§

impl<St> WithTag for St

§

fn tagged<T>(self, tag: T) -> Tagged<T, St>

Produce a new stream from this one which yields item tupled with a constant tag
Source§

impl<B, A> LockBefore<B> for A
where B: LockAfter<A>,

Source§

impl<B, A> LockEqualOrBefore<B> for A
where A: LockBefore<B>,

§

impl<E> RunsTransport<Mpsc> for E

§

impl<E> RunsTransport<Mpsc> for E
where E: RunsTransport<Mpsc>,