Remove unimplemented itimer scheme.
This commit is contained in:
@@ -1,112 +0,0 @@
|
||||
use alloc::collections::BTreeMap;
|
||||
use core::{
|
||||
mem, str,
|
||||
sync::atomic::{AtomicUsize, Ordering},
|
||||
};
|
||||
use spin::RwLock;
|
||||
|
||||
use crate::{
|
||||
context::file::InternalFlags,
|
||||
syscall::{
|
||||
data::ITimerSpec,
|
||||
error::*,
|
||||
flag::{EventFlags, CLOCK_MONOTONIC, CLOCK_REALTIME},
|
||||
usercopy::{UserSliceRo, UserSliceWo},
|
||||
},
|
||||
};
|
||||
|
||||
use super::{CallerCtx, KernelScheme, OpenResult};
|
||||
pub struct ITimerScheme;
|
||||
|
||||
static NEXT_ID: AtomicUsize = AtomicUsize::new(1);
|
||||
// Using BTreeMap as hashbrown doesn't have a const constructor.
|
||||
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> {
|
||||
let clock = path.parse::<usize>().or(Err(Error::new(ENOENT)))?;
|
||||
|
||||
match clock {
|
||||
CLOCK_REALTIME => (),
|
||||
CLOCK_MONOTONIC => (),
|
||||
_ => return Err(Error::new(ENOENT)),
|
||||
}
|
||||
|
||||
let id = NEXT_ID.fetch_add(1, Ordering::Relaxed);
|
||||
HANDLES.write().insert(id, clock);
|
||||
|
||||
Ok(OpenResult::SchemeLocal(id, InternalFlags::empty()))
|
||||
}
|
||||
|
||||
fn fcntl(&self, _id: usize, _cmd: usize, _arg: usize) -> Result<usize> {
|
||||
Ok(0)
|
||||
}
|
||||
|
||||
fn fevent(&self, id: usize, _flags: EventFlags) -> Result<EventFlags> {
|
||||
let handles = HANDLES.read();
|
||||
handles
|
||||
.get(&id)
|
||||
.ok_or(Error::new(EBADF))
|
||||
.and(Ok(EventFlags::empty()))
|
||||
}
|
||||
|
||||
fn fsync(&self, id: usize) -> Result<()> {
|
||||
HANDLES.read().get(&id).ok_or(Error::new(EBADF)).and(Ok(()))
|
||||
}
|
||||
|
||||
fn close(&self, id: usize) -> Result<()> {
|
||||
HANDLES
|
||||
.write()
|
||||
.remove(&id)
|
||||
.ok_or(Error::new(EBADF))
|
||||
.and(Ok(()))
|
||||
}
|
||||
fn kread(&self, id: usize, buf: UserSliceWo, _flags: u32, _stored_flags: u32) -> Result<usize> {
|
||||
let _clock = {
|
||||
let handles = HANDLES.read();
|
||||
*handles.get(&id).ok_or(Error::new(EBADF))?
|
||||
};
|
||||
|
||||
let mut specs_read = 0;
|
||||
|
||||
for current_chunk in buf.in_exact_chunks(mem::size_of::<ITimerSpec>()) {
|
||||
current_chunk.copy_exactly(&ITimerSpec::default())?;
|
||||
|
||||
specs_read += 1;
|
||||
}
|
||||
|
||||
Ok(specs_read * mem::size_of::<ITimerSpec>())
|
||||
}
|
||||
|
||||
fn kwrite(
|
||||
&self,
|
||||
id: usize,
|
||||
buf: UserSliceRo,
|
||||
_flags: u32,
|
||||
_stored_flags: u32,
|
||||
) -> Result<usize> {
|
||||
let _clock = {
|
||||
let handles = HANDLES.read();
|
||||
*handles.get(&id).ok_or(Error::new(EBADF))?
|
||||
};
|
||||
|
||||
let mut specs_written = 0;
|
||||
|
||||
for chunk in buf.in_exact_chunks(mem::size_of::<ITimerSpec>()) {
|
||||
let time = unsafe { chunk.read_exact::<ITimerSpec>()? };
|
||||
|
||||
println!("{}: {:?}", specs_written, time);
|
||||
specs_written += 1;
|
||||
}
|
||||
|
||||
Ok(specs_written * mem::size_of::<ITimerSpec>())
|
||||
}
|
||||
fn kfpath(&self, id: usize, buf: UserSliceWo) -> Result<usize> {
|
||||
let clock = {
|
||||
let handles = HANDLES.read();
|
||||
*handles.get(&id).ok_or(Error::new(EBADF))?
|
||||
};
|
||||
|
||||
buf.copy_common_bytes_from_slice(format!("time:{}", clock).as_bytes())
|
||||
}
|
||||
}
|
||||
+3
-11
@@ -32,9 +32,9 @@ use self::acpi::AcpiScheme;
|
||||
use self::dtb::DtbScheme;
|
||||
|
||||
use self::{
|
||||
debug::DebugScheme, event::EventScheme, irq::IrqScheme, itimer::ITimerScheme,
|
||||
memory::MemoryScheme, pipe::PipeScheme, proc::ProcScheme, root::RootScheme, serio::SerioScheme,
|
||||
sys::SysScheme, time::TimeScheme, user::UserScheme,
|
||||
debug::DebugScheme, event::EventScheme, irq::IrqScheme, memory::MemoryScheme, pipe::PipeScheme,
|
||||
proc::ProcScheme, root::RootScheme, serio::SerioScheme, sys::SysScheme, time::TimeScheme,
|
||||
user::UserScheme,
|
||||
};
|
||||
|
||||
/// When compiled with the "acpi" feature - `acpi:` - allows drivers to read a limited set of ACPI tables.
|
||||
@@ -52,9 +52,6 @@ pub mod event;
|
||||
/// `irq:` - allows userspace handling of IRQs
|
||||
pub mod irq;
|
||||
|
||||
/// `itimer:` - support for getitimer and setitimer
|
||||
pub mod itimer;
|
||||
|
||||
/// `memory:` - a scheme for accessing physical memory
|
||||
pub mod memory;
|
||||
|
||||
@@ -139,7 +136,6 @@ impl SchemeList {
|
||||
Serio,
|
||||
Irq,
|
||||
Time,
|
||||
ITimer,
|
||||
Sys,
|
||||
ProcFull,
|
||||
ProcRestricted,
|
||||
@@ -185,8 +181,6 @@ impl SchemeList {
|
||||
.unwrap();
|
||||
self.insert_global(ns, "event", GlobalSchemes::Event)
|
||||
.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();
|
||||
@@ -543,7 +537,6 @@ pub enum GlobalSchemes {
|
||||
Serio,
|
||||
Irq,
|
||||
Time,
|
||||
ITimer,
|
||||
Sys,
|
||||
ProcFull,
|
||||
ProcRestricted,
|
||||
@@ -584,7 +577,6 @@ impl core::ops::Deref for GlobalSchemes {
|
||||
Self::Serio => &SerioScheme,
|
||||
Self::Irq => &IrqScheme,
|
||||
Self::Time => &TimeScheme,
|
||||
Self::ITimer => &ITimerScheme,
|
||||
Self::Sys => &SysScheme,
|
||||
Self::ProcFull => &ProcScheme::<true>,
|
||||
Self::ProcRestricted => &ProcScheme::<false>,
|
||||
|
||||
Reference in New Issue
Block a user