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( | ||||
|     epfd: FileDesc, | ||||
|     op: EpollOp, | ||||
|     op: c_int, | ||||
|     fd: FileDesc, | ||||
|     event: *const libc::epoll_event, | ||||
| ) -> Result<(), Error> { | ||||
|     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 epoll = file_ref.as_epoll()?.inner.lock().unwrap(); | ||||
| 
 | ||||
|     match op { | ||||
|         EpollOp::Add(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)?, | ||||
|     } | ||||
|     let host_fd = file_table_ref.get(fd)?.as_socket()?.fd() as FileDesc; | ||||
|     epoll.ctl(op, host_fd, event)?; | ||||
| 
 | ||||
|     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 { | ||||
|     inner: SgxMutex<EpollFileInner>, | ||||
| } | ||||
| @ -215,8 +194,6 @@ impl EpollFile { | ||||
| 
 | ||||
| struct EpollFileInner { | ||||
|     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?
 | ||||
| @ -229,44 +206,17 @@ impl EpollFileInner { | ||||
|         } | ||||
|         Ok(EpollFileInner { | ||||
|             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
 | ||||
|     /// 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"))?; | ||||
|     pub fn ctl(&mut self, op: c_int, host_fd: FileDesc, event: *const libc::epoll_event) -> Result<(), Error> { | ||||
|         let ret = unsafe { | ||||
|             libc::ocall::epoll_ctl( | ||||
|                 self.epoll_fd, | ||||
|                 libc::EPOLL_CTL_MOD, | ||||
|                 op, | ||||
|                 host_fd as c_int, | ||||
|                 &mut event, | ||||
|                 event as *mut _, | ||||
|             ) | ||||
|         }; | ||||
|         if ret < 0 { | ||||
| @ -275,26 +225,6 @@ impl EpollFileInner { | ||||
|         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.
 | ||||
|     /// Returns the number of file descriptors ready for the requested I/O.
 | ||||
|     pub fn wait( | ||||
| @ -384,8 +314,6 @@ impl Debug for EpollFile { | ||||
|         let inner = self.inner.lock().unwrap(); | ||||
|         f.debug_struct("EpollFile") | ||||
|             .field("epoll_fd", &inner.epoll_fd) | ||||
|             .field("fds", &inner.fd_to_host.keys()) | ||||
|             .field("host_fds", &inner.fd_to_host.values()) | ||||
|             .finish() | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -7,7 +7,7 @@ | ||||
| //! 3. Dispatch the syscall to `do_*` (at this file)
 | ||||
| //! 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 process::{ChildProcessFilter, FileAction, pid_t, CloneFlags, FutexFlags, FutexOp}; | ||||
| use std::ffi::{CStr, CString}; | ||||
| @ -1105,19 +1105,10 @@ fn do_epoll_ctl( | ||||
|     fd: c_int, | ||||
|     event: *const libc::epoll_event, | ||||
| ) -> Result<isize, Error> { | ||||
|     let event = if event.is_null() { | ||||
|         None | ||||
|     } else { | ||||
|     if !event.is_null() { | ||||
|         check_ptr(event)?; | ||||
|         Some(unsafe { event.read() }) | ||||
|     }; | ||||
|     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)?; | ||||
|     } | ||||
|     fs::do_epoll_ctl(epfd as FileDesc, op, fd as FileDesc, event)?; | ||||
|     Ok(0) | ||||
| } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user