Merge branch 'cap2' of https://github.com/Yoric/redox into Yoric-cap2
This commit is contained in:
commit
297b6e09fc
18 changed files with 254 additions and 108 deletions
|
@ -1,14 +1,15 @@
|
|||
use core::str;
|
||||
use core::sync::atomic::{AtomicUsize, Ordering, ATOMIC_USIZE_INIT};
|
||||
use core::sync::atomic::Ordering;
|
||||
use spin::Once;
|
||||
|
||||
use context;
|
||||
use scheme::*;
|
||||
use sync::WaitQueue;
|
||||
use syscall::error::*;
|
||||
use syscall::flag::EVENT_READ;
|
||||
use syscall::scheme::Scheme;
|
||||
|
||||
pub static DEBUG_SCHEME_ID: AtomicUsize = ATOMIC_USIZE_INIT;
|
||||
pub static DEBUG_SCHEME_ID: AtomicSchemeId = ATOMIC_SCHEMEID_INIT;
|
||||
|
||||
/// Input queue
|
||||
static INPUT: Once<WaitQueue<u8>> = Once::new();
|
||||
|
|
|
@ -1,14 +1,15 @@
|
|||
use core::{mem, str};
|
||||
use core::sync::atomic::{AtomicUsize, ATOMIC_USIZE_INIT, Ordering};
|
||||
use core::sync::atomic::Ordering;
|
||||
use spin::Mutex;
|
||||
|
||||
use arch::interrupt::irq::acknowledge;
|
||||
use context;
|
||||
use scheme::{AtomicSchemeId, ATOMIC_SCHEMEID_INIT};
|
||||
use syscall::error::*;
|
||||
use syscall::flag::EVENT_READ;
|
||||
use syscall::scheme::Scheme;
|
||||
|
||||
pub static IRQ_SCHEME_ID: AtomicUsize = ATOMIC_USIZE_INIT;
|
||||
pub static IRQ_SCHEME_ID: AtomicSchemeId = ATOMIC_SCHEMEID_INIT;
|
||||
|
||||
/// IRQ queues
|
||||
static ACKS: Mutex<[usize; 16]> = Mutex::new([0; 16]);
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
use alloc::arc::Arc;
|
||||
use alloc::boxed::Box;
|
||||
use collections::BTreeMap;
|
||||
use core::sync::atomic::Ordering;
|
||||
use core::sync::atomic::{AtomicUsize, Ordering};
|
||||
use spin::{Once, RwLock, RwLockReadGuard, RwLockWriteGuard};
|
||||
|
||||
use syscall::error::*;
|
||||
|
@ -62,10 +62,19 @@ pub mod zero;
|
|||
/// Limit on number of schemes
|
||||
pub const SCHEME_MAX_SCHEMES: usize = 65536;
|
||||
|
||||
/// Unique identifier for a scheme.
|
||||
int_like!(SchemeId, AtomicSchemeId, usize, AtomicUsize);
|
||||
|
||||
pub const ATOMIC_SCHEMEID_INIT: AtomicSchemeId = AtomicSchemeId::default();
|
||||
|
||||
/// Unique identifier for a file descriptor.
|
||||
int_like!(FileHandle, AtomicFileHandle, usize, AtomicUsize);
|
||||
|
||||
|
||||
/// Scheme list type
|
||||
pub struct SchemeList {
|
||||
map: BTreeMap<usize, Arc<Box<Scheme + Send + Sync>>>,
|
||||
names: BTreeMap<Box<[u8]>, usize>,
|
||||
map: BTreeMap<SchemeId, Arc<Box<Scheme + Send + Sync>>>,
|
||||
names: BTreeMap<Box<[u8]>, SchemeId>,
|
||||
next_id: usize
|
||||
}
|
||||
|
||||
|
@ -79,20 +88,20 @@ impl SchemeList {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn iter(&self) -> ::collections::btree_map::Iter<usize, Arc<Box<Scheme + Send + Sync>>> {
|
||||
pub fn iter(&self) -> ::collections::btree_map::Iter<SchemeId, Arc<Box<Scheme + Send + Sync>>> {
|
||||
self.map.iter()
|
||||
}
|
||||
|
||||
pub fn iter_name(&self) -> ::collections::btree_map::Iter<Box<[u8]>, usize> {
|
||||
pub fn iter_name(&self) -> ::collections::btree_map::Iter<Box<[u8]>, SchemeId> {
|
||||
self.names.iter()
|
||||
}
|
||||
|
||||
/// Get the nth scheme.
|
||||
pub fn get(&self, id: usize) -> Option<&Arc<Box<Scheme + Send + Sync>>> {
|
||||
pub fn get(&self, id: SchemeId) -> Option<&Arc<Box<Scheme + Send + Sync>>> {
|
||||
self.map.get(&id)
|
||||
}
|
||||
|
||||
pub fn get_name(&self, name: &[u8]) -> Option<(usize, &Arc<Box<Scheme + Send + Sync>>)> {
|
||||
pub fn get_name(&self, name: &[u8]) -> Option<(SchemeId, &Arc<Box<Scheme + Send + Sync>>)> {
|
||||
if let Some(&id) = self.names.get(name) {
|
||||
self.get(id).map(|scheme| (id, scheme))
|
||||
} else {
|
||||
|
@ -101,7 +110,7 @@ impl SchemeList {
|
|||
}
|
||||
|
||||
/// Create a new scheme.
|
||||
pub fn insert(&mut self, name: Box<[u8]>, scheme: Arc<Box<Scheme + Send + Sync>>) -> Result<usize> {
|
||||
pub fn insert(&mut self, name: Box<[u8]>, scheme: Arc<Box<Scheme + Send + Sync>>) -> Result<SchemeId> {
|
||||
if self.names.contains_key(&name) {
|
||||
return Err(Error::new(EEXIST));
|
||||
}
|
||||
|
@ -110,7 +119,7 @@ impl SchemeList {
|
|||
self.next_id = 1;
|
||||
}
|
||||
|
||||
while self.map.contains_key(&self.next_id) {
|
||||
while self.map.contains_key(&SchemeId(self.next_id)) {
|
||||
self.next_id += 1;
|
||||
}
|
||||
|
||||
|
@ -118,12 +127,11 @@ impl SchemeList {
|
|||
return Err(Error::new(EAGAIN));
|
||||
}
|
||||
|
||||
let id = self.next_id;
|
||||
let id = SchemeId(self.next_id);
|
||||
self.next_id += 1;
|
||||
|
||||
assert!(self.map.insert(id, scheme).is_none());
|
||||
assert!(self.names.insert(name, id).is_none());
|
||||
|
||||
Ok(id)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@ use alloc::arc::{Arc, Weak};
|
|||
use collections::{BTreeMap, VecDeque};
|
||||
use core::sync::atomic::{AtomicUsize, ATOMIC_USIZE_INIT, Ordering};
|
||||
use spin::{Mutex, Once, RwLock, RwLockReadGuard, RwLockWriteGuard};
|
||||
use scheme::{AtomicSchemeId, ATOMIC_SCHEMEID_INIT};
|
||||
|
||||
use sync::WaitCondition;
|
||||
use syscall::error::{Error, Result, EAGAIN, EBADF, EINVAL, EPIPE};
|
||||
|
@ -9,7 +10,7 @@ use syscall::flag::{F_GETFL, F_SETFL, O_CLOEXEC, O_NONBLOCK};
|
|||
use syscall::scheme::Scheme;
|
||||
|
||||
/// Pipes list
|
||||
pub static PIPE_SCHEME_ID: AtomicUsize = ATOMIC_USIZE_INIT;
|
||||
pub static PIPE_SCHEME_ID: AtomicSchemeId = ATOMIC_SCHEMEID_INIT;
|
||||
static PIPE_NEXT_ID: AtomicUsize = ATOMIC_USIZE_INIT;
|
||||
static PIPES: Once<RwLock<(BTreeMap<usize, Arc<PipeRead>>, BTreeMap<usize, Arc<PipeWrite>>)>> = Once::new();
|
||||
|
||||
|
|
|
@ -1,16 +1,16 @@
|
|||
use alloc::arc::Arc;
|
||||
use alloc::boxed::Box;
|
||||
use collections::BTreeMap;
|
||||
use core::sync::atomic::{AtomicUsize, ATOMIC_USIZE_INIT, Ordering};
|
||||
use core::sync::atomic::{AtomicUsize, Ordering};
|
||||
use spin::RwLock;
|
||||
|
||||
use context;
|
||||
use syscall::error::*;
|
||||
use syscall::scheme::Scheme;
|
||||
use scheme;
|
||||
use scheme::{self, AtomicSchemeId, ATOMIC_SCHEMEID_INIT};
|
||||
use scheme::user::{UserInner, UserScheme};
|
||||
|
||||
pub static ROOT_SCHEME_ID: AtomicUsize = ATOMIC_USIZE_INIT;
|
||||
pub static ROOT_SCHEME_ID: AtomicSchemeId = ATOMIC_SCHEMEID_INIT;
|
||||
|
||||
pub struct RootScheme {
|
||||
next_id: AtomicUsize,
|
||||
|
|
|
@ -83,8 +83,8 @@ pub fn resource() -> Result<Vec<u8>> {
|
|||
let name = str::from_utf8(&name_bytes).unwrap_or("");
|
||||
|
||||
string.push_str(&format!("{:<6}{:<6}{:<6}{:<6}{:<6}{:<6}{:<8}{}\n",
|
||||
context.id,
|
||||
context.ppid,
|
||||
context.id.into(),
|
||||
context.ppid.into(),
|
||||
context.euid,
|
||||
context.egid,
|
||||
stat_string,
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
use alloc::arc::{Arc, Weak};
|
||||
use collections::BTreeMap;
|
||||
use core::sync::atomic::{AtomicUsize, AtomicU64, Ordering};
|
||||
use core::sync::atomic::{AtomicU64, Ordering};
|
||||
use core::{mem, slice, usize};
|
||||
use spin::{Mutex, RwLock};
|
||||
|
||||
|
@ -10,6 +10,7 @@ use arch::paging::temporary_page::TemporaryPage;
|
|||
use context::{self, Context};
|
||||
use context::memory::Grant;
|
||||
use scheme::root::ROOT_SCHEME_ID;
|
||||
use scheme::{AtomicSchemeId, ATOMIC_SCHEMEID_INIT};
|
||||
use sync::{WaitQueue, WaitMap};
|
||||
use syscall::data::{Packet, Stat};
|
||||
use syscall::error::*;
|
||||
|
@ -20,7 +21,7 @@ use syscall::scheme::Scheme;
|
|||
pub struct UserInner {
|
||||
handle_id: usize,
|
||||
flags: usize,
|
||||
pub scheme_id: AtomicUsize,
|
||||
pub scheme_id: AtomicSchemeId,
|
||||
next_id: AtomicU64,
|
||||
context: Weak<RwLock<Context>>,
|
||||
todo: WaitQueue<Packet>,
|
||||
|
@ -33,7 +34,7 @@ impl UserInner {
|
|||
UserInner {
|
||||
handle_id: handle_id,
|
||||
flags: flags,
|
||||
scheme_id: AtomicUsize::new(0),
|
||||
scheme_id: ATOMIC_SCHEMEID_INIT,
|
||||
next_id: AtomicU64::new(1),
|
||||
context: context,
|
||||
todo: WaitQueue::new(),
|
||||
|
@ -52,7 +53,7 @@ impl UserInner {
|
|||
|
||||
self.call_inner(Packet {
|
||||
id: self.next_id.fetch_add(1, Ordering::SeqCst),
|
||||
pid: pid,
|
||||
pid: pid.into(),
|
||||
uid: uid,
|
||||
gid: gid,
|
||||
a: a,
|
||||
|
@ -296,7 +297,7 @@ impl Scheme for UserScheme {
|
|||
|
||||
inner.call_inner(Packet {
|
||||
id: id,
|
||||
pid: pid,
|
||||
pid: pid.into(),
|
||||
uid: uid,
|
||||
gid: gid,
|
||||
a: SYS_FMAP,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue