diff --git a/src/procmgr.rs b/src/procmgr.rs index 21d11da081..a7677d2300 100644 --- a/src/procmgr.rs +++ b/src/procmgr.rs @@ -35,6 +35,13 @@ use syscall::{ SIGTTIN, SIGTTOU, }; +#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)] +enum VirtualId { + KernelId(Id), + // TODO: slab or something for better ID reuse + // InternalId(u64), +} + pub fn run(write_fd: usize, auth: &FdGuard) { let socket = Socket::nonblock("proc").expect("failed to open proc scheme socket"); @@ -53,8 +60,8 @@ pub fn run(write_fd: usize, auth: &FdGuard) { let _ = syscall::write(write_fd, &[0]); let _ = syscall::close(write_fd); - let mut states = HashMap::::new(); - let mut awoken = VecDeque::::new(); + let mut states = HashMap::::new(); + let mut awoken = VecDeque::::new(); let mut new_awoken = VecDeque::new(); 'outer: loop { @@ -159,12 +166,12 @@ fn handle_scheme<'a>( req: Request, socket: &'a Socket, scheme: &mut ProcScheme<'a>, - states: &mut HashMap, - awoken: &mut VecDeque, + states: &mut HashMap, + awoken: &mut VecDeque, ) -> Poll { match req.kind() { RequestKind::Call(req) => { - let req_id = req.request_id(); + let req_id = VirtualId::KernelId(req.request_id()); let op = match req.op() { Ok(op) => op, Err(req) => return Response::ready_err(ENOSYS, req), @@ -279,10 +286,10 @@ struct Process { status: ProcessStatus, - awaiting_threads_term: Vec, + awaiting_threads_term: Vec, waitpid: BTreeMap, - waitpid_waiting: VecDeque, + waitpid_waiting: VecDeque, sig_pctl: Option>, rtqs: Vec>, @@ -731,9 +738,9 @@ impl<'a> ProcScheme<'a> { } pub fn on_call( &mut self, - state: VacantEntry, + state: VacantEntry, mut op: OpCall, - awoken: &mut VecDeque, + awoken: &mut VecDeque, ) -> Poll { let id = op.fd; let (payload, metadata) = op.payload_and_metadata(); @@ -963,8 +970,8 @@ impl<'a> ProcScheme<'a> { &mut self, pid: ProcessId, status: i32, - mut state: VacantEntry, - awoken: &mut VecDeque, + mut state: VacantEntry, + awoken: &mut VecDeque, tag: Tag, ) -> Poll { let Some(proc_rc) = self.processes.get(&pid) else { @@ -1010,7 +1017,7 @@ impl<'a> ProcScheme<'a> { this_pid: ProcessId, target: WaitpidTarget, flags: WaitFlags, - req_id: Id, + req_id: VirtualId, ) -> Poll> { if matches!( target, @@ -1276,8 +1283,8 @@ impl<'a> ProcScheme<'a> { } pub fn work_on( &mut self, - mut state_entry: OccupiedEntry, - awoken: &mut VecDeque, + mut state_entry: OccupiedEntry, + awoken: &mut VecDeque, ) -> Poll { let req_id = *state_entry.key(); let mut state = state_entry.get_mut(); @@ -1365,7 +1372,7 @@ impl<'a> ProcScheme<'a> { target: ProcKillTarget, signal: u8, mode: KillMode, - awoken: &mut VecDeque, + awoken: &mut VecDeque, ) -> Result<()> { log::trace!("KILL(from {caller_pid:?}) TARGET {target:?} {signal} {mode:?}"); let mut num_succeeded = 0; @@ -1426,7 +1433,7 @@ impl<'a> ProcScheme<'a> { killed_self: &mut bool, mode: KillMode, is_sigchld_to_parent: bool, - awoken: &mut VecDeque, + awoken: &mut VecDeque, ) -> Result<()> { let sig = usize::from(signal); debug_assert!(sig <= 64);