From de28cc4918bcf738ec99e06a06db584032d1e956 Mon Sep 17 00:00:00 2001 From: 4lDO2 <4lDO2@protonmail.com> Date: Mon, 16 Aug 2021 13:40:53 +0200 Subject: [PATCH] Add a Scheme supertrait for kernel-only methods. --- src/scheme/acpi.rs | 1 + src/scheme/debug.rs | 1 + src/scheme/event.rs | 1 + src/scheme/initfs.rs | 1 + src/scheme/irq.rs | 1 + src/scheme/itimer.rs | 1 + src/scheme/live.rs | 1 + src/scheme/memory.rs | 1 + src/scheme/mod.rs | 12 +++++++----- src/scheme/pipe.rs | 1 + src/scheme/proc.rs | 1 + src/scheme/root.rs | 1 + src/scheme/serio.rs | 1 + src/scheme/sys/mod.rs | 1 + src/scheme/time.rs | 1 + src/scheme/user.rs | 1 + 16 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/scheme/acpi.rs b/src/scheme/acpi.rs index 41e731b..fd0929e 100644 --- a/src/scheme/acpi.rs +++ b/src/scheme/acpi.rs @@ -288,3 +288,4 @@ impl Scheme for AcpiScheme { Ok(0) } } +impl crate::scheme::KernelScheme for AcpiScheme {} diff --git a/src/scheme/debug.rs b/src/scheme/debug.rs index 0aa6ee7..9fd1739 100644 --- a/src/scheme/debug.rs +++ b/src/scheme/debug.rs @@ -165,3 +165,4 @@ impl Scheme for DebugScheme { Ok(0) } } +impl crate::scheme::KernelScheme for DebugScheme {} diff --git a/src/scheme/event.rs b/src/scheme/event.rs index 3ae5015..c9cf663 100644 --- a/src/scheme/event.rs +++ b/src/scheme/event.rs @@ -71,3 +71,4 @@ impl Scheme for EventScheme { queues_mut().remove(&id).ok_or(Error::new(EBADF)).and(Ok(0)) } } +impl crate::scheme::KernelScheme for EventScheme {} diff --git a/src/scheme/initfs.rs b/src/scheme/initfs.rs index 4c7f3a5..c881cbd 100644 --- a/src/scheme/initfs.rs +++ b/src/scheme/initfs.rs @@ -273,3 +273,4 @@ impl Scheme for InitFsScheme { Ok(0) } } +impl crate::scheme::KernelScheme for InitFsScheme {} diff --git a/src/scheme/irq.rs b/src/scheme/irq.rs index 09d4e5c..dcf0172 100644 --- a/src/scheme/irq.rs +++ b/src/scheme/irq.rs @@ -371,3 +371,4 @@ impl Scheme for IrqScheme { Ok(0) } } +impl crate::scheme::KernelScheme for IrqScheme {} diff --git a/src/scheme/itimer.rs b/src/scheme/itimer.rs index 11bc559..1c8f27d 100644 --- a/src/scheme/itimer.rs +++ b/src/scheme/itimer.rs @@ -106,3 +106,4 @@ impl Scheme for ITimerScheme { self.handles.write().remove(&id).ok_or(Error::new(EBADF)).and(Ok(0)) } } +impl crate::scheme::KernelScheme for ITimerScheme {} diff --git a/src/scheme/live.rs b/src/scheme/live.rs index 6cc6963..9ccb4b0 100644 --- a/src/scheme/live.rs +++ b/src/scheme/live.rs @@ -202,3 +202,4 @@ impl Scheme for DiskScheme { self.handles.write().remove(&id).ok_or(Error::new(EBADF)).and(Ok(0)) } } +impl crate::scheme::KernelScheme for DiskScheme {} diff --git a/src/scheme/memory.rs b/src/scheme/memory.rs index f5f29a2..4dd65c4 100644 --- a/src/scheme/memory.rs +++ b/src/scheme/memory.rs @@ -85,3 +85,4 @@ impl Scheme for MemoryScheme { Ok(0) } } +impl crate::scheme::KernelScheme for MemoryScheme {} diff --git a/src/scheme/mod.rs b/src/scheme/mod.rs index f8f1a1b..d781d6a 100644 --- a/src/scheme/mod.rs +++ b/src/scheme/mod.rs @@ -107,7 +107,7 @@ impl<'a> Iterator for SchemeIter<'a> { /// Scheme list type pub struct SchemeList { - map: BTreeMap>, + map: BTreeMap>, names: BTreeMap, SchemeId>>, next_ns: usize, next_id: usize @@ -201,7 +201,7 @@ impl SchemeList { Ok(to) } - pub fn iter(&self) -> ::alloc::collections::btree_map::Iter> { + pub fn iter(&self) -> ::alloc::collections::btree_map::Iter> { self.map.iter() } @@ -212,11 +212,11 @@ impl SchemeList { } /// Get the nth scheme. - pub fn get(&self, id: SchemeId) -> Option<&Arc> { + pub fn get(&self, id: SchemeId) -> Option<&Arc> { self.map.get(&id) } - pub fn get_name(&self, ns: SchemeNamespace, name: &str) -> Option<(SchemeId, &Arc)> { + pub fn get_name(&self, ns: SchemeNamespace, name: &str) -> Option<(SchemeId, &Arc)> { if let Some(names) = self.names.get(&ns) { if let Some(&id) = names.get(name) { return self.get(id).map(|scheme| (id, scheme)); @@ -227,7 +227,7 @@ impl SchemeList { /// Create a new scheme. pub fn insert(&mut self, ns: SchemeNamespace, name: &str, scheme_fn: F) -> Result - where F: Fn(SchemeId) -> Arc + where F: Fn(SchemeId) -> Arc { if let Some(names) = self.names.get(&ns) { if names.contains_key(name) { @@ -298,3 +298,5 @@ pub fn schemes() -> RwLockReadGuard<'static, SchemeList> { pub fn schemes_mut() -> RwLockWriteGuard<'static, SchemeList> { SCHEMES.call_once(init_schemes).write() } + +pub trait KernelScheme: Scheme + Send + Sync + 'static {} diff --git a/src/scheme/pipe.rs b/src/scheme/pipe.rs index d9e3fdc..ab7cb16 100644 --- a/src/scheme/pipe.rs +++ b/src/scheme/pipe.rs @@ -264,3 +264,4 @@ impl Drop for PipeWrite { self.condition.notify(); } } +impl crate::scheme::KernelScheme for PipeScheme {} diff --git a/src/scheme/proc.rs b/src/scheme/proc.rs index cb2fc92..e3365e2 100644 --- a/src/scheme/proc.rs +++ b/src/scheme/proc.rs @@ -824,3 +824,4 @@ impl Scheme for ProcScheme { Ok(0) } } +impl crate::scheme::KernelScheme for ProcScheme {} diff --git a/src/scheme/root.rs b/src/scheme/root.rs index 248c4b5..ff2a13f 100644 --- a/src/scheme/root.rs +++ b/src/scheme/root.rs @@ -344,3 +344,4 @@ impl Scheme for RootScheme { Ok(0) } } +impl crate::scheme::KernelScheme for RootScheme {} diff --git a/src/scheme/serio.rs b/src/scheme/serio.rs index 0a74742..ba0169d 100644 --- a/src/scheme/serio.rs +++ b/src/scheme/serio.rs @@ -162,3 +162,4 @@ impl Scheme for SerioScheme { Ok(0) } } +impl crate::scheme::KernelScheme for SerioScheme {} diff --git a/src/scheme/sys/mod.rs b/src/scheme/sys/mod.rs index 6c2c6f0..82cea67 100644 --- a/src/scheme/sys/mod.rs +++ b/src/scheme/sys/mod.rs @@ -170,3 +170,4 @@ impl Scheme for SysScheme { self.handles.write().remove(&id).ok_or(Error::new(EBADF)).and(Ok(0)) } } +impl crate::scheme::KernelScheme for SysScheme {} diff --git a/src/scheme/time.rs b/src/scheme/time.rs index bc0143b..a5f9286 100644 --- a/src/scheme/time.rs +++ b/src/scheme/time.rs @@ -117,3 +117,4 @@ impl Scheme for TimeScheme { self.handles.write().remove(&id).ok_or(Error::new(EBADF)).and(Ok(0)) } } +impl crate::scheme::KernelScheme for TimeScheme {} diff --git a/src/scheme/user.rs b/src/scheme/user.rs index 65433d2..3ba08f4 100644 --- a/src/scheme/user.rs +++ b/src/scheme/user.rs @@ -528,3 +528,4 @@ impl Scheme for UserScheme { inner.call(SYS_CLOSE, file, 0, 0) } } +impl crate::scheme::KernelScheme for UserScheme {}