diff --git a/src/scheme/itimer.rs b/src/scheme/itimer.rs index d8babc306a..90e6a354c6 100644 --- a/src/scheme/itimer.rs +++ b/src/scheme/itimer.rs @@ -9,20 +9,10 @@ use crate::syscall::flag::{CLOCK_REALTIME, CLOCK_MONOTONIC, EventFlags}; use crate::syscall::usercopy::{UserSliceWo, UserSliceRo}; use super::{KernelScheme, CallerCtx, OpenResult}; +pub struct ITimerScheme; -pub struct ITimerScheme { - next_id: AtomicUsize, - handles: RwLock> -} - -impl ITimerScheme { - pub fn new() -> ITimerScheme { - ITimerScheme { - next_id: AtomicUsize::new(0), - handles: RwLock::new(BTreeMap::new()) - } - } -} +static NEXT_ID: AtomicUsize = AtomicUsize::new(1); +static HANDLES: RwLock> = RwLock::new(BTreeMap::new()); impl KernelScheme for ITimerScheme { fn kopen(&self, path: &str, _flags: usize, _ctx: CallerCtx) -> Result { @@ -34,8 +24,8 @@ impl KernelScheme for ITimerScheme { _ => return Err(Error::new(ENOENT)) } - let id = self.next_id.fetch_add(1, Ordering::Relaxed); - self.handles.write().insert(id, clock); + let id = NEXT_ID.fetch_add(1, Ordering::Relaxed); + HANDLES.write().insert(id, clock); Ok(OpenResult::SchemeLocal(id)) } @@ -45,21 +35,20 @@ impl KernelScheme for ITimerScheme { } fn fevent(&self, id: usize, _flags: EventFlags) -> Result { - let handles = self.handles.read(); + let handles = HANDLES.read(); handles.get(&id).ok_or(Error::new(EBADF)).and(Ok(EventFlags::empty())) } fn fsync(&self, id: usize) -> Result<()> { - let handles = self.handles.read(); - handles.get(&id).ok_or(Error::new(EBADF)).and(Ok(())) + HANDLES.read().get(&id).ok_or(Error::new(EBADF)).and(Ok(())) } fn close(&self, id: usize) -> Result<()> { - self.handles.write().remove(&id).ok_or(Error::new(EBADF)).and(Ok(())) + HANDLES.write().remove(&id).ok_or(Error::new(EBADF)).and(Ok(())) } fn kread(&self, id: usize, buf: UserSliceWo) -> Result { let _clock = { - let handles = self.handles.read(); + let handles = HANDLES.read(); *handles.get(&id).ok_or(Error::new(EBADF))? }; @@ -76,7 +65,7 @@ impl KernelScheme for ITimerScheme { fn kwrite(&self, id: usize, buf: UserSliceRo) -> Result { let _clock = { - let handles = self.handles.read(); + let handles = HANDLES.read(); *handles.get(&id).ok_or(Error::new(EBADF))? }; @@ -93,7 +82,7 @@ impl KernelScheme for ITimerScheme { } fn kfpath(&self, id: usize, buf: UserSliceWo) -> Result { let clock = { - let handles = self.handles.read(); + let handles = HANDLES.read(); *handles.get(&id).ok_or(Error::new(EBADF))? }; diff --git a/src/scheme/mod.rs b/src/scheme/mod.rs index b56f6485f4..faae9939a0 100644 --- a/src/scheme/mod.rs +++ b/src/scheme/mod.rs @@ -133,7 +133,7 @@ impl SchemeList { // TODO: impl TryFrom and bypass map for global schemes? { use GlobalSchemes::*; - insert_globals(&[Debug, Event, Memory, Pipe, Serio, Irq, Time]); + insert_globals(&[Debug, Event, Memory, Pipe, Serio, Irq, Time, ITimer]); #[cfg(all(feature = "acpi", any(target_arch = "x86", target_arch = "x86_64")))] insert_globals(&[Acpi]); @@ -164,7 +164,7 @@ impl SchemeList { self.insert(ns, "", |scheme_id| KernelSchemes::Root(Arc::new(RootScheme::new(ns, scheme_id)))).unwrap(); self.insert_global(ns, "event", GlobalSchemes::Event).unwrap(); - self.insert(ns, "itimer", |_| KernelSchemes::ITimer(Arc::new(ITimerScheme::new()))).unwrap(); + self.insert_global(ns, "itimer", GlobalSchemes::ITimer).unwrap(); self.insert_global(ns, "memory", GlobalSchemes::Memory).unwrap(); self.insert_global(ns, "pipe", GlobalSchemes::Pipe).unwrap(); self.insert(ns, "sys", |_| KernelSchemes::Sys(Arc::new(SysScheme::new()))).unwrap(); @@ -432,7 +432,6 @@ pub fn calc_seek_offset(cur_pos: usize, rel_pos: isize, whence: usize, len: usiz #[derive(Clone)] pub enum KernelSchemes { - ITimer(Arc), Proc(Arc), Root(Arc), Sys(Arc), @@ -449,6 +448,7 @@ pub enum GlobalSchemes { Serio, Irq, Time, + ITimer, #[cfg(all(feature = "acpi", any(target_arch = "x86", target_arch = "x86_64")))] Acpi, @@ -464,7 +464,6 @@ impl core::ops::Deref for KernelSchemes { fn deref(&self) -> &Self::Target { match self { - Self::ITimer(scheme) => &**scheme, Self::Proc(scheme) => &**scheme, Self::Root(scheme) => &**scheme, Self::Sys(scheme) => &**scheme, @@ -486,6 +485,7 @@ impl core::ops::Deref for GlobalSchemes { Self::Serio => &SerioScheme, Self::Irq => &IrqScheme, Self::Time => &TimeScheme, + Self::ITimer => &ITimerScheme, #[cfg(all(feature = "acpi", any(target_arch = "x86", target_arch = "x86_64")))] Self::Acpi => &AcpiScheme, }