Add set_tid_address

This commit is contained in:
Tate, Hongliang Tian 2019-04-06 14:42:54 +08:00 committed by Tate Tian
parent 8dfeb71c90
commit 2f2b74a570
4 changed files with 39 additions and 12 deletions

@ -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)
}