simplify epoll_ctl
This commit is contained in:
parent
82f4169618
commit
58a7f7c126
@ -119,8 +119,9 @@ pub fn do_epoll_create1(flags: c_int) -> Result<FileDesc, Error> {
|
|||||||
|
|
||||||
pub fn do_epoll_ctl(
|
pub fn do_epoll_ctl(
|
||||||
epfd: FileDesc,
|
epfd: FileDesc,
|
||||||
op: EpollOp,
|
op: c_int,
|
||||||
fd: FileDesc,
|
fd: FileDesc,
|
||||||
|
event: *const libc::epoll_event,
|
||||||
) -> Result<(), Error> {
|
) -> Result<(), Error> {
|
||||||
info!("epoll_ctl: epfd: {}, op: {:?}, fd: {}", epfd, op, fd);
|
info!("epoll_ctl: epfd: {}, op: {:?}, fd: {}", epfd, op, fd);
|
||||||
|
|
||||||
@ -130,14 +131,9 @@ pub fn do_epoll_ctl(
|
|||||||
let mut file_ref = file_table_ref.get(epfd)?;
|
let mut file_ref = file_table_ref.get(epfd)?;
|
||||||
let mut epoll = file_ref.as_epoll()?.inner.lock().unwrap();
|
let mut epoll = file_ref.as_epoll()?.inner.lock().unwrap();
|
||||||
|
|
||||||
match op {
|
let host_fd = file_table_ref.get(fd)?.as_socket()?.fd() as FileDesc;
|
||||||
EpollOp::Add(event) => {
|
epoll.ctl(op, host_fd, event)?;
|
||||||
let host_fd = file_table_ref.get(fd)?.as_socket()?.fd() as FileDesc;
|
|
||||||
epoll.add(fd, host_fd, event)?;
|
|
||||||
},
|
|
||||||
EpollOp::Modify(event) => epoll.modify(fd, event)?,
|
|
||||||
EpollOp::Delete => epoll.remove(fd)?,
|
|
||||||
}
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -184,23 +180,6 @@ impl FdSetExt for libc::fd_set {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub enum EpollOp {
|
|
||||||
Add(libc::epoll_event),
|
|
||||||
Modify(libc::epoll_event),
|
|
||||||
Delete
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Debug for EpollOp {
|
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
||||||
let s = match self {
|
|
||||||
EpollOp::Add(_) => "Add",
|
|
||||||
EpollOp::Modify(_) => "Modify",
|
|
||||||
EpollOp::Delete => "Delete",
|
|
||||||
};
|
|
||||||
write!(f, "{}", s)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct EpollFile {
|
pub struct EpollFile {
|
||||||
inner: SgxMutex<EpollFileInner>,
|
inner: SgxMutex<EpollFileInner>,
|
||||||
}
|
}
|
||||||
@ -215,8 +194,6 @@ impl EpollFile {
|
|||||||
|
|
||||||
struct EpollFileInner {
|
struct EpollFileInner {
|
||||||
epoll_fd: c_int,
|
epoll_fd: c_int,
|
||||||
fd_to_host: BTreeMap<FileDesc, FileDesc>,
|
|
||||||
fd_to_libos: BTreeMap<FileDesc, FileDesc>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: What if a Linux fd is closed but still in an epoll?
|
// FIXME: What if a Linux fd is closed but still in an epoll?
|
||||||
@ -229,44 +206,17 @@ impl EpollFileInner {
|
|||||||
}
|
}
|
||||||
Ok(EpollFileInner {
|
Ok(EpollFileInner {
|
||||||
epoll_fd: ret,
|
epoll_fd: ret,
|
||||||
fd_to_host: BTreeMap::new(),
|
|
||||||
fd_to_libos: BTreeMap::new(),
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Add `fd` to the interest list and associate the settings
|
|
||||||
/// specified in `event` with the internal file linked to `fd`.
|
|
||||||
pub fn add(&mut self, fd: FileDesc, host_fd: FileDesc, mut event: libc::epoll_event) -> Result<(), Error> {
|
|
||||||
if self.fd_to_host.contains_key(&fd) {
|
|
||||||
return Err(Error::new(EEXIST, "fd is exist in epoll"));
|
|
||||||
}
|
|
||||||
let ret = unsafe {
|
|
||||||
libc::ocall::epoll_ctl(
|
|
||||||
self.epoll_fd,
|
|
||||||
libc::EPOLL_CTL_ADD,
|
|
||||||
host_fd as c_int,
|
|
||||||
&mut event,
|
|
||||||
)
|
|
||||||
};
|
|
||||||
if ret < 0 {
|
|
||||||
return Err(Error::new(Errno::from_retval(ret as i32), ""));
|
|
||||||
}
|
|
||||||
self.fd_to_host.insert(fd, host_fd);
|
|
||||||
self.fd_to_libos.insert(host_fd, fd);
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Change the settings associated with `fd` in the interest list to
|
pub fn ctl(&mut self, op: c_int, host_fd: FileDesc, event: *const libc::epoll_event) -> Result<(), Error> {
|
||||||
/// the new settings specified in `event`.
|
|
||||||
pub fn modify(&mut self, fd: FileDesc, mut event: libc::epoll_event) -> Result<(), Error> {
|
|
||||||
let host_fd = *self.fd_to_host.get(&fd)
|
|
||||||
.ok_or(Error::new(EINVAL, "fd is not exist in epoll"))?;
|
|
||||||
let ret = unsafe {
|
let ret = unsafe {
|
||||||
libc::ocall::epoll_ctl(
|
libc::ocall::epoll_ctl(
|
||||||
self.epoll_fd,
|
self.epoll_fd,
|
||||||
libc::EPOLL_CTL_MOD,
|
op,
|
||||||
host_fd as c_int,
|
host_fd as c_int,
|
||||||
&mut event,
|
event as *mut _,
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
if ret < 0 {
|
if ret < 0 {
|
||||||
@ -275,26 +225,6 @@ impl EpollFileInner {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Remove the target file descriptor `fd` from the interest list.
|
|
||||||
pub fn remove(&mut self, fd: FileDesc) -> Result<(), Error> {
|
|
||||||
let host_fd = *self.fd_to_host.get(&fd)
|
|
||||||
.ok_or(Error::new(EINVAL, "fd is not exist in epoll"))?;
|
|
||||||
let ret = unsafe {
|
|
||||||
libc::ocall::epoll_ctl(
|
|
||||||
self.epoll_fd,
|
|
||||||
libc::EPOLL_CTL_DEL,
|
|
||||||
host_fd as c_int,
|
|
||||||
core::ptr::null_mut(),
|
|
||||||
)
|
|
||||||
};
|
|
||||||
if ret < 0 {
|
|
||||||
return Err(Error::new(Errno::from_retval(ret as i32), ""));
|
|
||||||
}
|
|
||||||
self.fd_to_host.remove(&fd);
|
|
||||||
self.fd_to_libos.remove(&host_fd);
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Wait for an I/O event on the epoll.
|
/// Wait for an I/O event on the epoll.
|
||||||
/// Returns the number of file descriptors ready for the requested I/O.
|
/// Returns the number of file descriptors ready for the requested I/O.
|
||||||
pub fn wait(
|
pub fn wait(
|
||||||
@ -384,8 +314,6 @@ impl Debug for EpollFile {
|
|||||||
let inner = self.inner.lock().unwrap();
|
let inner = self.inner.lock().unwrap();
|
||||||
f.debug_struct("EpollFile")
|
f.debug_struct("EpollFile")
|
||||||
.field("epoll_fd", &inner.epoll_fd)
|
.field("epoll_fd", &inner.epoll_fd)
|
||||||
.field("fds", &inner.fd_to_host.keys())
|
|
||||||
.field("host_fds", &inner.fd_to_host.values())
|
|
||||||
.finish()
|
.finish()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
//! 3. Dispatch the syscall to `do_*` (at this file)
|
//! 3. Dispatch the syscall to `do_*` (at this file)
|
||||||
//! 4. Do some memory checks then call `mod::do_*` (at each module)
|
//! 4. Do some memory checks then call `mod::do_*` (at each module)
|
||||||
|
|
||||||
use fs::{File, SocketFile, FileDesc, FileRef, EpollOp, AccessModes, AccessFlags, AT_FDCWD, FcntlCmd};
|
use fs::{File, SocketFile, FileDesc, FileRef, AccessModes, AccessFlags, AT_FDCWD, FcntlCmd};
|
||||||
use prelude::*;
|
use prelude::*;
|
||||||
use process::{ChildProcessFilter, FileAction, pid_t, CloneFlags, FutexFlags, FutexOp};
|
use process::{ChildProcessFilter, FileAction, pid_t, CloneFlags, FutexFlags, FutexOp};
|
||||||
use std::ffi::{CStr, CString};
|
use std::ffi::{CStr, CString};
|
||||||
@ -1105,19 +1105,10 @@ fn do_epoll_ctl(
|
|||||||
fd: c_int,
|
fd: c_int,
|
||||||
event: *const libc::epoll_event,
|
event: *const libc::epoll_event,
|
||||||
) -> Result<isize, Error> {
|
) -> Result<isize, Error> {
|
||||||
let event = if event.is_null() {
|
if !event.is_null() {
|
||||||
None
|
|
||||||
} else {
|
|
||||||
check_ptr(event)?;
|
check_ptr(event)?;
|
||||||
Some(unsafe { event.read() })
|
}
|
||||||
};
|
fs::do_epoll_ctl(epfd as FileDesc, op, fd as FileDesc, event)?;
|
||||||
let op = match (op, event) {
|
|
||||||
(libc::EPOLL_CTL_ADD, Some(event)) => EpollOp::Add(event),
|
|
||||||
(libc::EPOLL_CTL_MOD, Some(event)) => EpollOp::Modify(event),
|
|
||||||
(libc::EPOLL_CTL_DEL, _) => EpollOp::Delete,
|
|
||||||
_ => return Err(Error::new(EINVAL, "invalid epoll op or event ptr")),
|
|
||||||
};
|
|
||||||
fs::do_epoll_ctl(epfd as FileDesc, op, fd as FileDesc)?;
|
|
||||||
Ok(0)
|
Ok(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user