Add set_tid_address
This commit is contained in:
parent
8dfeb71c90
commit
2f2b74a570
@ -6,7 +6,7 @@ pub mod table {
|
||||
pub use self::exit::{do_exit, do_wait4, ChildProcessFilter};
|
||||
pub use self::spawn::{do_spawn, FileAction};
|
||||
pub use self::wait::{WaitQueue, Waiter};
|
||||
pub use self::thread::{do_clone, CloneFlags, ThreadGroup};
|
||||
pub use self::thread::{do_clone, CloneFlags, ThreadGroup, do_set_tid_address};
|
||||
pub use self::futex::{FutexOp, FutexFlags, futex_op_and_flags_from_u32, futex_wake, futex_wait};
|
||||
pub use self::arch_prctl::{ArchPrctlCode, do_arch_prctl};
|
||||
|
||||
@ -24,6 +24,7 @@ pub struct Process {
|
||||
// TODO: move cwd, root_inode into a FileSystem structure
|
||||
// TODO: should cwd be a String or INode?
|
||||
cwd: String,
|
||||
clear_child_tid: Option<*mut pid_t>,
|
||||
parent: Option<ProcessRef>,
|
||||
children: Vec<ProcessWeakRef>,
|
||||
waiting_children: Option<WaitQueue<ChildProcessFilter, pid_t>>,
|
||||
@ -42,7 +43,13 @@ pub fn do_getpid() -> pid_t {
|
||||
current.get_pid()
|
||||
}
|
||||
|
||||
pub fn do_getgpid() -> pid_t {
|
||||
pub fn do_gettid() -> pid_t {
|
||||
let current_ref = get_current();
|
||||
let current = current_ref.lock().unwrap();
|
||||
current.get_tid()
|
||||
}
|
||||
|
||||
pub fn do_getpgid() -> pid_t {
|
||||
let current_ref = get_current();
|
||||
let current = current_ref.lock().unwrap();
|
||||
current.get_pgid()
|
||||
|
@ -14,6 +14,7 @@ lazy_static! {
|
||||
tgid: 0,
|
||||
exit_status: 0,
|
||||
cwd: "/".to_owned(),
|
||||
clear_child_tid: None,
|
||||
parent: None,
|
||||
children: Vec::new(),
|
||||
waiting_children: Default::default(),
|
||||
@ -38,6 +39,7 @@ impl Process {
|
||||
pgid: new_pid,
|
||||
tgid: new_pid,
|
||||
cwd: cwd.to_owned(),
|
||||
clear_child_tid: None,
|
||||
exit_status: 0,
|
||||
parent: None,
|
||||
children: Vec::new(),
|
||||
@ -54,15 +56,17 @@ impl Process {
|
||||
pub fn get_task_mut(&mut self) -> &mut Task {
|
||||
&mut self.task
|
||||
}
|
||||
/// pid as seen by the user is actually the thread group ID
|
||||
pub fn get_pid(&self) -> pid_t {
|
||||
self.tgid
|
||||
}
|
||||
/// tid as seen by the user is actually the process ID
|
||||
pub fn get_tid(&self) -> pid_t {
|
||||
self.pid
|
||||
}
|
||||
pub fn get_pgid(&self) -> pid_t {
|
||||
self.pgid
|
||||
}
|
||||
pub fn get_tgid(&self) -> pid_t {
|
||||
self.tgid
|
||||
}
|
||||
pub fn get_status(&self) -> Status {
|
||||
self.status
|
||||
}
|
||||
@ -101,6 +105,9 @@ impl Drop for Process {
|
||||
}
|
||||
}
|
||||
|
||||
unsafe impl Send for Process {}
|
||||
unsafe impl Sync for Process {}
|
||||
|
||||
#[derive(Clone, Copy, Debug, PartialEq)]
|
||||
pub enum Status {
|
||||
RUNNING,
|
||||
|
@ -82,3 +82,11 @@ fn new_thread_task(user_stack: usize, new_tls: usize) -> Result<Task, Error> {
|
||||
..Default::default()
|
||||
})
|
||||
}
|
||||
|
||||
pub fn do_set_tid_address(tidptr: *mut pid_t) -> Result<pid_t, Error> {
|
||||
info!("set_tid_address: tidptr: {:#x}", tidptr as usize);
|
||||
let current_ref = get_current();
|
||||
let mut current = current_ref.lock().unwrap();
|
||||
current.clear_child_tid = Some(tidptr);
|
||||
Ok(current.get_tid())
|
||||
}
|
||||
|
@ -79,6 +79,10 @@ pub extern "C" fn dispatch_syscall(
|
||||
arg3 as *const *const i8,
|
||||
arg4 as *const FdOp,
|
||||
),
|
||||
SYS_WAIT4 => do_wait4(arg0 as i32, arg1 as *mut i32),
|
||||
SYS_GETPID => do_getpid(),
|
||||
SYS_GETPPID => do_getppid(),
|
||||
|
||||
SYS_CLONE => do_clone(
|
||||
arg0 as u32,
|
||||
arg1 as usize,
|
||||
@ -86,15 +90,14 @@ pub extern "C" fn dispatch_syscall(
|
||||
arg3 as *mut i32,
|
||||
arg4 as usize,
|
||||
),
|
||||
SYS_WAIT4 => do_wait4(arg0 as i32, arg1 as *mut i32),
|
||||
SYS_FUTEX => do_futex(
|
||||
arg0 as *const i32,
|
||||
arg1 as u32,
|
||||
arg2 as i32,
|
||||
// TODO: accept other optional arguments
|
||||
),
|
||||
SYS_GETPID => do_getpid(),
|
||||
SYS_GETPPID => do_getppid(),
|
||||
SYS_ARCH_PRCTL => do_arch_prctl(arg0 as u32, arg1 as *mut usize),
|
||||
SYS_SET_TID_ADDRESS => do_set_tid_address(arg0 as *mut pid_t),
|
||||
|
||||
SYS_MMAP => do_mmap(
|
||||
arg0 as usize,
|
||||
@ -122,8 +125,6 @@ pub extern "C" fn dispatch_syscall(
|
||||
|
||||
SYS_GETTIMEOFDAY => do_gettimeofday(arg0 as *mut timeval_t),
|
||||
|
||||
SYS_ARCH_PRCTL => do_arch_prctl(arg0 as u32, arg1 as *mut usize),
|
||||
|
||||
_ => do_unknown(num, arg0, arg1, arg2, arg3, arg4, arg5),
|
||||
};
|
||||
debug!("syscall return: {:?}", ret);
|
||||
@ -506,8 +507,8 @@ fn do_wait4(pid: i32, _exit_status: *mut i32) -> Result<isize, Error> {
|
||||
pid if pid < -1 => process::ChildProcessFilter::WithPGID((-pid) as pid_t),
|
||||
-1 => process::ChildProcessFilter::WithAnyPID,
|
||||
0 => {
|
||||
let gpid = process::do_getgpid();
|
||||
process::ChildProcessFilter::WithPGID(gpid)
|
||||
let pgid = process::do_getpgid();
|
||||
process::ChildProcessFilter::WithPGID(pgid)
|
||||
}
|
||||
pid if pid > 0 => process::ChildProcessFilter::WithPID(pid as pid_t),
|
||||
_ => {
|
||||
@ -663,3 +664,7 @@ fn do_arch_prctl(code: u32, addr: *mut usize) -> Result<isize, Error> {
|
||||
process::do_arch_prctl(code, addr).map(|_| 0)
|
||||
}
|
||||
|
||||
fn do_set_tid_address(tidptr: *mut pid_t) -> Result<isize, Error> {
|
||||
check_mut_ptr(tidptr)?;
|
||||
process::do_set_tid_address(tidptr).map(|tid| tid as isize)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user