From c734f7969996f191f11dd170d7eda974cf0e0a84 Mon Sep 17 00:00:00 2001 From: WangRunji Date: Thu, 25 Oct 2018 01:04:31 +0800 Subject: [PATCH] Drop context when process exit. Remove util mod. --- crate/process/src/lib.rs | 2 +- crate/process/src/process_manager.rs | 12 +++++++++--- crate/process/src/util.rs | 15 --------------- 3 files changed, 10 insertions(+), 19 deletions(-) delete mode 100644 crate/process/src/util.rs diff --git a/crate/process/src/lib.rs b/crate/process/src/lib.rs index dde6fee..823c334 100644 --- a/crate/process/src/lib.rs +++ b/crate/process/src/lib.rs @@ -2,6 +2,7 @@ #![feature(alloc)] #![feature(const_fn)] #![feature(linkage)] +#![feature(nll)] extern crate alloc; #[macro_use] @@ -17,7 +18,6 @@ mod process_manager; mod processor; pub mod scheduler; pub mod thread; -mod util; mod event_hub; pub use process_manager::*; diff --git a/crate/process/src/process_manager.rs b/crate/process/src/process_manager.rs index 37a9652..b7e5d47 100644 --- a/crate/process/src/process_manager.rs +++ b/crate/process/src/process_manager.rs @@ -19,8 +19,8 @@ const MAX_PROC_NUM: usize = 32; pub enum Status { Ready, Running(usize), - Waiting(Pid), Sleeping, + /// aka ZOMBIE. Its context was dropped. Exited(ExitCode), } @@ -98,8 +98,10 @@ impl ProcessManager { proc.status = proc.status_after_stop.clone(); proc.status_after_stop = Status::Ready; proc.context = Some(context); - if proc.status == Status::Ready { - self.scheduler.lock().insert(pid); + match proc.status { + Status::Ready => self.scheduler.lock().insert(pid), + Status::Exited(_) => proc.context = None, + _ => {} } } @@ -121,5 +123,9 @@ impl ProcessManager { Status::Running(_) => proc.status_after_stop = status, _ => proc.status = status, } + match proc.status { + Status::Exited(_) => proc.context = None, + _ => {} + } } } diff --git a/crate/process/src/util.rs b/crate/process/src/util.rs deleted file mode 100644 index 11a8d3c..0000000 --- a/crate/process/src/util.rs +++ /dev/null @@ -1,15 +0,0 @@ -use core::fmt::Debug; - -/// Get values by 2 diff keys at the same time -pub trait GetMut2 { - type Output; - fn get_mut(&mut self, id: Idx) -> &mut Self::Output; - fn get_mut2(&mut self, id1: Idx, id2: Idx) -> (&mut Self::Output, &mut Self::Output) { - assert_ne!(id1, id2); - let self1 = self as *mut Self; - let self2 = self1; - let p1 = unsafe { &mut *self1 }.get_mut(id1); - let p2 = unsafe { &mut *self2 }.get_mut(id2); - (p1, p2) - } -}