1
0
mirror of https://github.com/rcore-os/rCore.git synced 2024-11-22 16:16:16 +04:00

modify select implementation

This commit is contained in:
ssryps 2019-10-17 11:11:11 +08:00
parent 0aa995d98c
commit ba09ab92a8
4 changed files with 98 additions and 22 deletions

View File

@ -1,3 +1,2 @@
#!/bin/bash #!/bin/bash
sleep 10 && sudo ifconfig tap0 10.0.0.1 &
make run net=on arch=x86_64 mode=release make run net=on arch=x86_64 mode=release

View File

@ -7,6 +7,7 @@ use crate::syscall::{SysError, SysResult};
use alloc::boxed::Box; use alloc::boxed::Box;
use rcore_fs::vfs::PollStatus; use rcore_fs::vfs::PollStatus;
use crate::sync::Condvar; use crate::sync::Condvar;
use alloc::vec::Vec;
// TODO: merge FileLike to FileHandle ? // TODO: merge FileLike to FileHandle ?
// TODO: fix dup and remove Clone // TODO: fix dup and remove Clone
@ -58,12 +59,15 @@ impl FileLike {
Ok(status) Ok(status)
} }
pub fn poll_condvar(&self) -> Option<&Condvar> { pub fn poll_condvar(&self, condvars: &mut Vec<&Condvar>) {
let condvar = match self { let condvar = match self {
FileLike::File(file) => file.poll_condvar()?, FileLike::File(file) => {
FileLike::Socket(socket) => socket.poll_condvar()? condvars.push(&crate::fs::STDIN.pushed);
},
FileLike::Socket(socket) => {
condvars.push(&(*crate::drivers::SOCKET_ACTIVITY));
},
}; };
Ok(status)
} }
pub fn fcntl(&mut self, cmd: usize, arg: usize) -> SysResult { pub fn fcntl(&mut self, cmd: usize, arg: usize) -> SysResult {

View File

@ -1,5 +1,4 @@
//! Syscalls for file system //! Syscalls for file system
use core::cell::UnsafeCell; use core::cell::UnsafeCell;
use core::cmp::min; use core::cmp::min;
use core::mem::size_of; use core::mem::size_of;
@ -102,6 +101,8 @@ impl Syscall<'_> {
// check whether the fds is valid and is owned by this process // check whether the fds is valid and is owned by this process
let mut condvars = Vec::new(); let mut condvars = Vec::new();
condvars.push(&(*TICK_ACTIVITY)); condvars.push(&(*TICK_ACTIVITY));
condvars.push(&STDIN.pushed);
condvars.push(&(*SOCKET_ACTIVITY));
let polls = unsafe { self.vm().check_write_array(ufds, nfds)? }; let polls = unsafe { self.vm().check_write_array(ufds, nfds)? };
for poll in polls.iter() { for poll in polls.iter() {
@ -110,22 +111,16 @@ impl Syscall<'_> {
return Err(SysError::EINVAL); return Err(SysError::EINVAL);
}, },
Some(file_like) => { Some(file_like) => {
if let Some(condvar) = file_like.poll_condvar(){ // file_like.poll_condvar(&mut condvars);
condvars.push(condvar);
} }
} }
} }
}
condvars =
drop(proc); drop(proc);
let begin_time_ms = crate::trap::uptime_msec(); let begin_time_ms = crate::trap::uptime_msec();
//&[&STDIN.pushed, &(*SOCKET_ACTIVITY)] condvars.as_slice()
// println!("poll called {:?}", condvars.len());
// condvars.push(&STDIN.pushed); Condvar::wait_events(condvars.as_slice(), move || {
// condvars.push(&(*SOCKET_ACTIVITY));
Condvar::wait_events(&condvars., move || {
use PollEvents as PE; use PollEvents as PE;
let proc = self.process(); let proc = self.process();
let mut events = 0; let mut events = 0;
@ -210,6 +205,12 @@ impl Syscall<'_> {
1 << 31 1 << 31
}; };
let mut condvars = Vec::new();
condvars.push(&(*TICK_ACTIVITY));
condvars.push(&STDIN.pushed);
condvars.push(&(*SOCKET_ACTIVITY));
println!("select used");
// for debugging // for debugging
if cfg!(debug_assertions) { if cfg!(debug_assertions) {
debug!("files before select {:#?}", proc.files); debug!("files before select {:#?}", proc.files);
@ -217,13 +218,13 @@ impl Syscall<'_> {
drop(proc); drop(proc);
let begin_time_ms = crate::trap::uptime_msec(); let begin_time_ms = crate::trap::uptime_msec();
Condvar::wait_events(&[&STDIN.pushed, &(*SOCKET_ACTIVITY)], move || { Condvar::wait_events(condvars.as_slice(), move || {
let proc = self.process(); let proc = self.process();
let mut events = 0; let mut events = 0;
for (&fd, file_like) in proc.files.iter() { for (&fd, file_like) in proc.files.iter() {
if fd >= nfds { // if fd >= nfds {
continue; // continue;
} // }
if !err_fds.contains(fd) && !read_fds.contains(fd) && !write_fds.contains(fd) { if !err_fds.contains(fd) && !read_fds.contains(fd) && !write_fds.contains(fd) {
continue; continue;
} }
@ -266,6 +267,59 @@ impl Syscall<'_> {
}) })
} }
pub fn sys_epoll_create(
&mut self,
size: usize,
) -> SysResult {
info!("epoll_create: size: {:?}", size);
return Ok(0);
}
pub fn sys_epoll_create1(
&mut self,
flags: usize,
) -> SysResult {
info!("epoll_create1: flags: {:?}", flags);
return Ok(0);
}
pub fn sys_epoll_ctl(
&mut self,
epfd: usize,
op: usize,
fd: usize,
event: *mut PollEvents,
) -> SysResult {
return Ok(0);
}
pub fn sys_epoll_wait(
&mut self,
epfd: usize,
events: *mut EpollEvent,
maxevents: usize,
timeout: usize,
) -> SysResult {
return Ok(0);
}
pub fn sys_epoll_pwait(
&mut self,
epfd: usize,
events: *mut EpollEvent,
maxevents: usize,
timeout: usize,
sigset_t: *mut SigSet_t,
) -> SysResult {
return Ok(0);
}
pub fn sys_readv(&mut self, fd: usize, iov_ptr: *const IoVec, iov_count: usize) -> SysResult { pub fn sys_readv(&mut self, fd: usize, iov_ptr: *const IoVec, iov_count: usize) -> SysResult {
info!( info!(
"readv: fd: {}, iov: {:?}, count: {}", "readv: fd: {}, iov: {:?}, count: {}",
@ -591,7 +645,6 @@ impl Syscall<'_> {
// BUGFIX: '..' and '.' // BUGFIX: '..' and '.'
if path.len() > 0 { if path.len() > 0 {
let cwd = match path.as_bytes()[0] { let cwd = match path.as_bytes()[0] {
b'/' => String::from("/"), b'/' => String::from("/"),
_ => proc.cwd.clone(), _ => proc.cwd.clone(),
@ -1557,5 +1610,22 @@ impl FdSet {
} }
} }
pub struct SigSet_t {
__val: [u64; 1024 / 8 / 8],
}
union epoll_data_t {
ptr: u64,
fd: i32,
v32: u32,
v64: u64,
}
pub struct EpollEvent {
events: u32, /* Epoll events */
data: epoll_data_t, /* User data variable */
}
/// Pathname is interpreted relative to the current working directory(CWD) /// Pathname is interpreted relative to the current working directory(CWD)
const AT_FDCWD: usize = -100isize as usize; const AT_FDCWD: usize = -100isize as usize;

View File

@ -165,7 +165,9 @@ impl Syscall<'_> {
SYS_PPOLL => { SYS_PPOLL => {
self.sys_ppoll(args[0] as *mut PollFd, args[1], args[2] as *const TimeSpec) self.sys_ppoll(args[0] as *mut PollFd, args[1], args[2] as *const TimeSpec)
} // ignore sigmask } // ignore sigmask
SYS_EPOLL_CREATE1 => self.unimplemented("epoll_create1", Err(SysError::ENOSYS)), SYS_EPOLL_CREATE1 => self.sys_epoll_create1(args[0]),
SYS_EPOLL_PWAIT => self.sys_epoll_pwait(args[0], args[1] as *mut EpollEvent,
args[2], args[3], args[4] as *mut SigSet_t),
// file system // file system
SYS_STATFS => self.unimplemented("statfs", Err(SysError::EACCES)), SYS_STATFS => self.unimplemented("statfs", Err(SysError::EACCES)),
@ -458,6 +460,7 @@ impl Syscall<'_> {
SYS_ARCH_PRCTL => self.sys_arch_prctl(args[0] as i32, args[1]), SYS_ARCH_PRCTL => self.sys_arch_prctl(args[0] as i32, args[1]),
SYS_TIME => self.sys_time(args[0] as *mut u64), SYS_TIME => self.sys_time(args[0] as *mut u64),
SYS_EPOLL_CREATE => self.unimplemented("epoll_create", Err(SysError::ENOSYS)), SYS_EPOLL_CREATE => self.unimplemented("epoll_create", Err(SysError::ENOSYS)),
// SYS_EPOLL_WAIT =>self.sys_epoll_wait(args[0], args[1] as *mut EpollEvent, args[2], args[3]),
_ => return None, _ => return None,
}; };
Some(ret) Some(ret)