Make itimer: global.

This commit is contained in:
4lDO2
2023-09-06 23:23:45 +02:00
parent 87b0c568a0
commit fe0e3103f4
2 changed files with 15 additions and 26 deletions
+11 -22
View File
@@ -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<BTreeMap<usize, usize>>
}
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<BTreeMap<usize, usize>> = RwLock::new(BTreeMap::new());
impl KernelScheme for ITimerScheme {
fn kopen(&self, path: &str, _flags: usize, _ctx: CallerCtx) -> Result<OpenResult> {
@@ -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<EventFlags> {
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<usize> {
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<usize> {
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<usize> {
let clock = {
let handles = self.handles.read();
let handles = HANDLES.read();
*handles.get(&id).ok_or(Error::new(EBADF))?
};
+4 -4
View File
@@ -133,7 +133,7 @@ impl SchemeList {
// TODO: impl TryFrom<SchemeId> 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<ITimerScheme>),
Proc(Arc<ProcScheme>),
Root(Arc<RootScheme>),
Sys(Arc<SysScheme>),
@@ -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,
}