Cleanup schemes list, remove lazy_static
This commit is contained in:
parent
0693540a5b
commit
2de2d4cac4
|
@ -9,7 +9,6 @@ crate-type = ["staticlib"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
bitflags = "*"
|
bitflags = "*"
|
||||||
lazy_static = "*"
|
|
||||||
spin = "*"
|
spin = "*"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
|
|
|
@ -67,6 +67,7 @@
|
||||||
#![feature(alloc)]
|
#![feature(alloc)]
|
||||||
#![feature(collections)]
|
#![feature(collections)]
|
||||||
#![feature(const_fn)]
|
#![feature(const_fn)]
|
||||||
|
#![feature(drop_types_in_const)]
|
||||||
#![feature(question_mark)]
|
#![feature(question_mark)]
|
||||||
#![no_std]
|
#![no_std]
|
||||||
|
|
||||||
|
@ -88,8 +89,6 @@ extern crate collections;
|
||||||
|
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate bitflags;
|
extern crate bitflags;
|
||||||
#[macro_use]
|
|
||||||
extern crate lazy_static;
|
|
||||||
extern crate spin;
|
extern crate spin;
|
||||||
|
|
||||||
/// Context management
|
/// Context management
|
||||||
|
|
|
@ -11,7 +11,7 @@ use alloc::boxed::Box;
|
||||||
|
|
||||||
use collections::BTreeMap;
|
use collections::BTreeMap;
|
||||||
|
|
||||||
use spin::{Mutex, RwLock};
|
use spin::{Once, Mutex, RwLock, RwLockReadGuard, RwLockWriteGuard};
|
||||||
|
|
||||||
use syscall::Result;
|
use syscall::Result;
|
||||||
|
|
||||||
|
@ -20,13 +20,23 @@ use self::debug::DebugScheme;
|
||||||
/// Debug scheme
|
/// Debug scheme
|
||||||
pub mod debug;
|
pub mod debug;
|
||||||
|
|
||||||
|
pub type SchemeList = BTreeMap<Box<[u8]>, Arc<Mutex<Box<Scheme + Send>>>>;
|
||||||
|
|
||||||
/// Schemes list
|
/// Schemes list
|
||||||
lazy_static! {
|
static SCHEMES: Once<RwLock<SchemeList>> = Once::new();
|
||||||
pub static ref SCHEMES: RwLock<BTreeMap<Box<[u8]>, Arc<Mutex<Box<Scheme + Send>>>>> = {
|
|
||||||
let mut map: BTreeMap<Box<[u8]>, Arc<Mutex<Box<Scheme + Send>>>> = BTreeMap::new();
|
fn init_schemes() -> RwLock<SchemeList> {
|
||||||
map.insert(Box::new(*b"debug"), Arc::new(Mutex::new(Box::new(DebugScheme))));
|
let mut map: SchemeList = BTreeMap::new();
|
||||||
RwLock::new(map)
|
map.insert(Box::new(*b"debug"), Arc::new(Mutex::new(Box::new(DebugScheme))));
|
||||||
};
|
RwLock::new(map)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn schemes() -> RwLockReadGuard<'static, SchemeList> {
|
||||||
|
SCHEMES.call_once(init_schemes).read()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn schemes_mut() -> RwLockWriteGuard<'static, SchemeList> {
|
||||||
|
SCHEMES.call_once(init_schemes).write()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A scheme trait, implemented by a scheme handler
|
/// A scheme trait, implemented by a scheme handler
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
//! Filesystem syscalls
|
//! Filesystem syscalls
|
||||||
|
|
||||||
|
use scheme;
|
||||||
|
|
||||||
use super::{Error, Result};
|
use super::{Error, Result};
|
||||||
|
|
||||||
/// Read syscall
|
/// Read syscall
|
||||||
|
@ -33,7 +35,7 @@ pub fn open(path: &[u8], flags: usize) -> Result<usize> {
|
||||||
|
|
||||||
let file = {
|
let file = {
|
||||||
if let Some(namespace) = namespace_opt {
|
if let Some(namespace) = namespace_opt {
|
||||||
let schemes = ::scheme::SCHEMES.read();
|
let schemes = scheme::schemes();
|
||||||
if let Some(scheme_mutex) = schemes.get(namespace) {
|
if let Some(scheme_mutex) = schemes.get(namespace) {
|
||||||
scheme_mutex.lock().open(reference_opt.unwrap_or(b""), flags)
|
scheme_mutex.lock().open(reference_opt.unwrap_or(b""), flags)
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in a new issue