Significant improvements for events - switch to event queue in orbital
This commit is contained in:
parent
6d19f59c08
commit
77810d6713
9 changed files with 69 additions and 42 deletions
|
@ -98,7 +98,8 @@ pub fn open(path: &[u8], flags: usize) -> Result<usize> {
|
|||
let context = context_lock.read();
|
||||
context.add_file(::context::file::File {
|
||||
scheme: scheme_id,
|
||||
number: file_id
|
||||
number: file_id,
|
||||
event: None,
|
||||
}).ok_or(Error::new(EMFILE))
|
||||
}
|
||||
|
||||
|
@ -113,12 +114,14 @@ pub fn pipe2(fds: &mut [usize], flags: usize) -> Result<usize> {
|
|||
|
||||
let read_fd = context.add_file(::context::file::File {
|
||||
scheme: scheme_id,
|
||||
number: read_id
|
||||
number: read_id,
|
||||
event: None,
|
||||
}).ok_or(Error::new(EMFILE))?;
|
||||
|
||||
let write_fd = context.add_file(::context::file::File {
|
||||
scheme: scheme_id,
|
||||
number: write_id
|
||||
number: write_id,
|
||||
event: None,
|
||||
}).ok_or(Error::new(EMFILE))?;
|
||||
|
||||
fds[0] = read_fd;
|
||||
|
@ -206,7 +209,9 @@ pub fn close(fd: usize) -> Result<usize> {
|
|||
file
|
||||
};
|
||||
|
||||
context::event::unregister(fd, file.scheme, file.number);
|
||||
if let Some(event_id) = file.event {
|
||||
context::event::unregister(fd, file.scheme, event_id);
|
||||
}
|
||||
|
||||
let scheme = {
|
||||
let schemes = scheme::schemes();
|
||||
|
@ -240,7 +245,8 @@ pub fn dup(fd: usize) -> Result<usize> {
|
|||
let context = context_lock.read();
|
||||
context.add_file(::context::file::File {
|
||||
scheme: file.scheme,
|
||||
number: new_id
|
||||
number: new_id,
|
||||
event: None,
|
||||
}).ok_or(Error::new(EMFILE))
|
||||
}
|
||||
|
||||
|
@ -250,8 +256,13 @@ pub fn fevent(fd: usize, flags: usize) -> Result<usize> {
|
|||
let contexts = context::contexts();
|
||||
let context_lock = contexts.current().ok_or(Error::new(ESRCH))?;
|
||||
let context = context_lock.read();
|
||||
let file = context.get_file(fd).ok_or(Error::new(EBADF))?;
|
||||
file
|
||||
let mut files = context.files.lock();
|
||||
let mut file = files.get_mut(fd).ok_or(Error::new(EBADF))?.ok_or(Error::new(EBADF))?;
|
||||
if let Some(event_id) = file.event.take() {
|
||||
println!("{}: {}:{}: events already registered: {}", fd, file.scheme, file.number, event_id);
|
||||
context::event::unregister(fd, file.scheme, event_id);
|
||||
}
|
||||
file.clone()
|
||||
};
|
||||
|
||||
let scheme = {
|
||||
|
@ -259,7 +270,15 @@ pub fn fevent(fd: usize, flags: usize) -> Result<usize> {
|
|||
let scheme = schemes.get(file.scheme).ok_or(Error::new(EBADF))?;
|
||||
scheme.clone()
|
||||
};
|
||||
scheme.fevent(file.number, flags)?;
|
||||
context::event::register(fd, file.scheme, file.number);
|
||||
let event_id = scheme.fevent(file.number, flags)?;
|
||||
{
|
||||
let contexts = context::contexts();
|
||||
let context_lock = contexts.current().ok_or(Error::new(ESRCH))?;
|
||||
let context = context_lock.read();
|
||||
let mut files = context.files.lock();
|
||||
let mut file = files.get_mut(fd).ok_or(Error::new(EBADF))?.ok_or(Error::new(EBADF))?;
|
||||
file.event = Some(event_id);
|
||||
}
|
||||
context::event::register(fd, file.scheme, event_id);
|
||||
Ok(0)
|
||||
}
|
||||
|
|
|
@ -232,7 +232,11 @@ pub fn clone(flags: usize, stack_base: usize) -> Result<usize> {
|
|||
};
|
||||
match result {
|
||||
Ok(new_number) => {
|
||||
Some(context::file::File { scheme: file.scheme, number: new_number })
|
||||
Some(context::file::File {
|
||||
scheme: file.scheme,
|
||||
number: new_number,
|
||||
event: None,
|
||||
})
|
||||
},
|
||||
Err(err) => {
|
||||
println!("clone: failed to dup {}: {:?}", fd, err);
|
||||
|
@ -616,7 +620,9 @@ pub fn exit(status: usize) -> ! {
|
|||
/// Files must be closed while context is valid so that messages can be passed
|
||||
for (fd, file_option) in close_files.drain(..).enumerate() {
|
||||
if let Some(file) = file_option {
|
||||
context::event::unregister(fd, file.scheme, file.number);
|
||||
if let Some(event_id) = file.event {
|
||||
context::event::unregister(fd, file.scheme, event_id);
|
||||
}
|
||||
|
||||
let scheme_option = {
|
||||
let schemes = scheme::schemes();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue