mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-20 23:26:32 +00:00
Make task store Arc<Thread> and process store Arc<Task>
This commit is contained in:
committed by
Tate, Hongliang Tian
parent
81b0f265b5
commit
f3174dbbbc
@ -2,6 +2,7 @@
|
||||
|
||||
use ostd::{
|
||||
cpu::UserContext,
|
||||
task::Task,
|
||||
user::{UserContextApi, UserSpace},
|
||||
};
|
||||
|
||||
@ -22,51 +23,48 @@ pub trait PosixThreadExt {
|
||||
self.as_posix_thread().unwrap().tid()
|
||||
}
|
||||
fn as_posix_thread(&self) -> Option<&PosixThread>;
|
||||
#[allow(clippy::too_many_arguments)]
|
||||
fn new_posix_thread_from_executable(
|
||||
tid: Tid,
|
||||
credentials: Credentials,
|
||||
process_vm: &ProcessVm,
|
||||
fs_resolver: &FsResolver,
|
||||
executable_path: &str,
|
||||
process: Weak<Process>,
|
||||
argv: Vec<CString>,
|
||||
envp: Vec<CString>,
|
||||
) -> Result<Arc<Self>>;
|
||||
}
|
||||
|
||||
impl PosixThreadExt for Thread {
|
||||
/// This function should only be called when launch shell()
|
||||
fn new_posix_thread_from_executable(
|
||||
tid: Tid,
|
||||
credentials: Credentials,
|
||||
process_vm: &ProcessVm,
|
||||
fs_resolver: &FsResolver,
|
||||
executable_path: &str,
|
||||
process: Weak<Process>,
|
||||
argv: Vec<CString>,
|
||||
envp: Vec<CString>,
|
||||
) -> Result<Arc<Self>> {
|
||||
let elf_file = {
|
||||
let fs_path = FsPath::new(AT_FDCWD, executable_path)?;
|
||||
fs_resolver.lookup(&fs_path)?
|
||||
};
|
||||
let (_, elf_load_info) =
|
||||
load_program_to_vm(process_vm, elf_file, argv, envp, fs_resolver, 1)?;
|
||||
|
||||
let vm_space = process_vm.root_vmar().vm_space().clone();
|
||||
let mut cpu_ctx = UserContext::default();
|
||||
cpu_ctx.set_instruction_pointer(elf_load_info.entry_point() as _);
|
||||
cpu_ctx.set_stack_pointer(elf_load_info.user_stack_top() as _);
|
||||
let user_space = Arc::new(UserSpace::new(vm_space, cpu_ctx));
|
||||
let thread_name = Some(ThreadName::new_from_executable_path(executable_path)?);
|
||||
let thread_builder = PosixThreadBuilder::new(tid, user_space, credentials)
|
||||
.thread_name(thread_name)
|
||||
.process(process);
|
||||
Ok(thread_builder.build())
|
||||
}
|
||||
|
||||
fn as_posix_thread(&self) -> Option<&PosixThread> {
|
||||
self.data().downcast_ref::<PosixThread>()
|
||||
}
|
||||
}
|
||||
|
||||
impl PosixThreadExt for Arc<Task> {
|
||||
fn as_posix_thread(&self) -> Option<&PosixThread> {
|
||||
Thread::borrow_from_task(self).as_posix_thread()
|
||||
}
|
||||
}
|
||||
|
||||
/// Creates a task for running an executable file.
|
||||
///
|
||||
/// This function should _only_ be used to create the init user task.
|
||||
#[allow(clippy::too_many_arguments)]
|
||||
pub fn create_posix_task_from_executable(
|
||||
tid: Tid,
|
||||
credentials: Credentials,
|
||||
process_vm: &ProcessVm,
|
||||
fs_resolver: &FsResolver,
|
||||
executable_path: &str,
|
||||
process: Weak<Process>,
|
||||
argv: Vec<CString>,
|
||||
envp: Vec<CString>,
|
||||
) -> Result<Arc<Task>> {
|
||||
let elf_file = {
|
||||
let fs_path = FsPath::new(AT_FDCWD, executable_path)?;
|
||||
fs_resolver.lookup(&fs_path)?
|
||||
};
|
||||
let (_, elf_load_info) = load_program_to_vm(process_vm, elf_file, argv, envp, fs_resolver, 1)?;
|
||||
|
||||
let vm_space = process_vm.root_vmar().vm_space().clone();
|
||||
let mut cpu_ctx = UserContext::default();
|
||||
cpu_ctx.set_instruction_pointer(elf_load_info.entry_point() as _);
|
||||
cpu_ctx.set_stack_pointer(elf_load_info.user_stack_top() as _);
|
||||
let user_space = Arc::new(UserSpace::new(vm_space, cpu_ctx));
|
||||
let thread_name = Some(ThreadName::new_from_executable_path(executable_path)?);
|
||||
let thread_builder = PosixThreadBuilder::new(tid, user_space, credentials)
|
||||
.thread_name(thread_name)
|
||||
.process(process);
|
||||
Ok(thread_builder.build())
|
||||
}
|
||||
|
Reference in New Issue
Block a user