Cleanup schemes list, remove lazy_static

This commit is contained in:
Jeremy Soller 2016-08-18 08:10:08 -06:00
parent 0693540a5b
commit 2de2d4cac4
4 changed files with 21 additions and 11 deletions

View file

@ -9,7 +9,6 @@ crate-type = ["staticlib"]
[dependencies] [dependencies]
bitflags = "*" bitflags = "*"
lazy_static = "*"
spin = "*" spin = "*"
[dev-dependencies] [dev-dependencies]

View file

@ -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

View file

@ -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> {
let mut map: SchemeList = BTreeMap::new();
map.insert(Box::new(*b"debug"), Arc::new(Mutex::new(Box::new(DebugScheme)))); map.insert(Box::new(*b"debug"), Arc::new(Mutex::new(Box::new(DebugScheme))));
RwLock::new(map) 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

View file

@ -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 {