pub struct Thread {
pub tid: u64,
pub page_table_pa: Pa,
pub file_struct: FileStruct,
pub mm_struct: MmStruct<LazyPager>,
}Expand description
A thread state of project 4, which contains file and memory state.
Fields§
§tid: u64§page_table_pa: Pa§file_struct: FileStruct§mm_struct: MmStruct<LazyPager>Implementations§
Source§impl Thread
impl Thread
Sourcepub fn from_mm_struct(mm_struct: MmStruct<LazyPager>, tid: u64) -> Self
pub fn from_mm_struct(mm_struct: MmStruct<LazyPager>, tid: u64) -> Self
Create a thread with given MmStruct.
Sourcepub fn from_file_mm_struct(
file_struct: FileStruct,
mm_struct: MmStruct<LazyPager>,
tid: u64,
) -> Self
pub fn from_file_mm_struct( file_struct: FileStruct, mm_struct: MmStruct<LazyPager>, tid: u64, ) -> Self
Create a thread with given MmStruct and FileStruct.
Sourcepub fn with_file_struct_mut<Args, R>(
&self,
f: impl FnOnce(&mut FileStruct, Args) -> R,
args: Args,
) -> R
pub fn with_file_struct_mut<Args, R>( &self, f: impl FnOnce(&mut FileStruct, Args) -> R, args: Args, ) -> R
Executes a closure with mutable access to the underlying file struct
(FileStruct).
This method provides a way to access and mutate the file struct
associated with the current thread. It accepts a closure f that
receives a mutable reference to the FileStruct and an
additional argument of type Args.
Sourcepub fn with_mm_struct_mut<Args, R>(
&self,
f: impl FnOnce(&mut MmStruct<LazyPager>, Args) -> R,
args: Args,
) -> R
pub fn with_mm_struct_mut<Args, R>( &self, f: impl FnOnce(&mut MmStruct<LazyPager>, Args) -> R, args: Args, ) -> R
Executes a closure with mutable access to the underlying memory struct
(MmStruct).
This method provides a way to access and mutate the memory struct
associated with the current thread. It accepts a closure f that
receives a mutable reference to the MmStruct<LazyPager> and an
additional argument of type Args.
Sourcepub fn with_file_mm_struct_mut<Args, R>(
&self,
f: impl FnOnce(&mut FileStruct, &mut MmStruct<LazyPager>, Args) -> R,
args: Args,
) -> R
pub fn with_file_mm_struct_mut<Args, R>( &self, f: impl FnOnce(&mut FileStruct, &mut MmStruct<LazyPager>, Args) -> R, args: Args, ) -> R
Executes a closure with mutable access to the underlying file struct
(FileStruct) and memory struct (MmStruct).
This method provides a way to access and mutate the file struct
associated with the current thread. It accepts a closure f that
receives a mutable reference to the FileStruct and an
additional argument of type Args.
Sourcepub fn exit(&self, abi: &SyscallAbi<'_>) -> Result<usize, KernelError>
pub fn exit(&self, abi: &SyscallAbi<'_>) -> Result<usize, KernelError>
Exit the current thread.
This function terminates the calling thread, returning the provided
exit code to any thread that joins on it.
§Syscall API
void exit(int status);status: The exit code returned to a joining thread.
§Behavior
- Wakes up any thread waiting via
thread_join. - Cleans up thread-local resources.
Sourcepub fn thread_create(&self, abi: &SyscallAbi<'_>) -> Result<usize, KernelError>
pub fn thread_create(&self, abi: &SyscallAbi<'_>) -> Result<usize, KernelError>
Create a new thread in the current process.
This function creates a new thread that begins execution at the given entry point with the specified argument.
§Syscall API
int thread_create(char *name, void *stack, void *(*start_routine)(void *), void *arg);name: Name of the thread.stack: Stack of the thread.start_routine: Pointer to the function to be executed by the thread.arg: Argument to be passed to the thread function.
§Behavior
- The new thread shares the same address space as the calling thread.
- The stack for the new thread is allocated automatically.
Sourcepub fn thread_join(&self, abi: &SyscallAbi<'_>) -> Result<usize, KernelError>
pub fn thread_join(&self, abi: &SyscallAbi<'_>) -> Result<usize, KernelError>
Wait for a thread to finish.
This function blocks the calling thread until the specified thread terminates, and retrieves its exit code.
Note that only a single call can receives the exit code of the dying
thread. If multiple thread_join is called on the same thread,
return values of others than the first one are InvalidArgument
error.
§Syscall API
int thread_join(int thread_id, int *retval);thread_id: ID of the thread to join.retval: Pointer to store the thread’s exit code (optional).
§Behavior
- If the target thread has already exited, returns immediately with the proper exit code.
- If
retvalis non-null, the exit code of the target thread is stored.
Sourcepub fn exit_group(&self, abi: &SyscallAbi<'_>) -> Result<usize, KernelError>
pub fn exit_group(&self, abi: &SyscallAbi<'_>) -> Result<usize, KernelError>
Exit a process.
This function terminates all the threads in the current process,
including the current caller thread. The exit code is provided as
the first argument (arg1) of the system call.
§Syscall API
int exit_group(int status);status: The thread’s exit code.
§Notes
- This function does not return in normal execution, as it terminates the process.
- If an error occurs, it returns a
KernelError
Trait Implementations§
Source§impl Task for Thread
impl Task for Thread
Source§fn syscall(&mut self, regs: &mut Registers)
fn syscall(&mut self, regs: &mut Registers)
Handles a system call request from a user program.
Source§fn access_ok(&self, addr: Range<Va>, is_write: bool) -> bool
fn access_ok(&self, addr: Range<Va>, is_write: bool) -> bool
Validates whether the given memory range is accessible for the process.
Source§fn page_fault(&mut self, ec: PFErrorCode, cr2: Va)
fn page_fault(&mut self, ec: PFErrorCode, cr2: Va)
Handles a page fault.
Source§fn with_page_table_pa(&self, f: &fn(Pa))
fn with_page_table_pa(&self, f: &fn(Pa))
Runs a given closure with physical address of page table.