From 06b39ed521789b9af530e370e8f4284fbc4eab25 Mon Sep 17 00:00:00 2001 From: WangRunji Date: Tue, 17 Jul 2018 11:01:51 +0800 Subject: [PATCH] Impl remove any for StrideScheduler --- crate/process/src/scheduler.rs | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/crate/process/src/scheduler.rs b/crate/process/src/scheduler.rs index f2ceac6..b6c69cd 100644 --- a/crate/process/src/scheduler.rs +++ b/crate/process/src/scheduler.rs @@ -43,7 +43,7 @@ mod rr { } } self._list_add_before(pid, 0); - debug!("insert {}", pid - 1); + trace!("rr insert {}", pid - 1); } fn remove(&mut self, pid: Pid) { @@ -51,7 +51,7 @@ mod rr { assert!(self.infos[pid].present); self.infos[pid].present = false; self._list_remove(pid); - debug!("remove {}", pid - 1); + trace!("rr remove {}", pid - 1); } fn select(&mut self) -> Option { @@ -59,7 +59,7 @@ mod rr { 0 => None, i => Some(i - 1), }; - debug!("select {:?}", ret); + trace!("rr select {:?}", ret); ret } @@ -149,16 +149,21 @@ mod stride { info.rest_slice = self.max_time_slice; } self.queue.push((-info.stride, pid)); - debug!("insert {}", pid); + trace!("stride insert {}", pid); } fn remove(&mut self, pid: Pid) { let info = &mut self.infos[pid]; assert!(info.present); info.present = false; - // FIXME: Support removing any element - assert_eq!(self.queue.pop().unwrap().1, pid, "Can only remove the top"); - debug!("remove {}", pid); + // BinaryHeap only support pop the top. + // So in order to remove an arbitrary element, + // we have to take all elements into a Vec, + // then push the rest back. + let rest: Vec<_> = self.queue.drain().filter(|&p| p.1 != pid).collect(); + use core::iter::FromIterator; + self.queue = BinaryHeap::from_iter(rest.into_iter()); + trace!("stride remove {}", pid); } fn select(&mut self) -> Option { @@ -167,9 +172,9 @@ mod stride { let old_stride = self.infos[pid].stride; self.infos[pid].pass(); let stride = self.infos[pid].stride; - debug!("{} stride {:#x} -> {:#x}", pid, old_stride, stride); + trace!("stride {} {:#x} -> {:#x}", pid, old_stride, stride); } - debug!("select {:?}", ret); + trace!("stride select {:?}", ret); ret } @@ -188,7 +193,7 @@ mod stride { fn set_priority(&mut self, pid: Pid, priority: u8) { self.infos[pid].priority = priority; - debug!("{} priority = {}", pid, priority); + trace!("stride {} priority = {}", pid, priority); } }