diff --git a/src/libos/src/process/mod.rs b/src/libos/src/process/mod.rs index 37539bc1..8ec293ec 100644 --- a/src/libos/src/process/mod.rs +++ b/src/libos/src/process/mod.rs @@ -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, children: Vec, waiting_children: Option>, @@ -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() diff --git a/src/libos/src/process/process.rs b/src/libos/src/process/process.rs index 2a203d0f..e932b081 100644 --- a/src/libos/src/process/process.rs +++ b/src/libos/src/process/process.rs @@ -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, diff --git a/src/libos/src/process/thread.rs b/src/libos/src/process/thread.rs index b1efeda1..52ba10a5 100644 --- a/src/libos/src/process/thread.rs +++ b/src/libos/src/process/thread.rs @@ -82,3 +82,11 @@ fn new_thread_task(user_stack: usize, new_tls: usize) -> Result { ..Default::default() }) } + +pub fn do_set_tid_address(tidptr: *mut pid_t) -> Result { + 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()) +} diff --git a/src/libos/src/syscall/mod.rs b/src/libos/src/syscall/mod.rs index d7828303..ebd39052 100644 --- a/src/libos/src/syscall/mod.rs +++ b/src/libos/src/syscall/mod.rs @@ -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 { 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 { process::do_arch_prctl(code, addr).map(|_| 0) } +fn do_set_tid_address(tidptr: *mut pid_t) -> Result { + check_mut_ptr(tidptr)?; + process::do_set_tid_address(tidptr).map(|tid| tid as isize) +}