Add ppoll
This commit is contained in:
parent
b61188889d
commit
fc7ba98ded
@ -7,8 +7,9 @@ use super::io_multiplexing::{AsEpollFile, EpollCtl, EpollFile, EpollFlags, FdSet
|
||||
use fs::{CreationFlags, File, FileDesc, FileRef};
|
||||
use misc::resource_t;
|
||||
use process::Process;
|
||||
use signal::{sigset_t, SigSet};
|
||||
use std::convert::TryFrom;
|
||||
use time::timeval_t;
|
||||
use time::{timespec_t, timeval_t};
|
||||
use util::mem_util::from_user;
|
||||
|
||||
pub fn do_socket(domain: c_int, socket_type: c_int, protocol: c_int) -> Result<isize> {
|
||||
@ -714,7 +715,40 @@ pub fn do_select(
|
||||
ret
|
||||
}
|
||||
|
||||
pub fn do_ppoll(
|
||||
fds: *mut libc::pollfd,
|
||||
nfds: libc::nfds_t,
|
||||
timeout_ts: *const timespec_t,
|
||||
sigmask: *const sigset_t,
|
||||
) -> Result<isize> {
|
||||
let mut timeout = if timeout_ts.is_null() {
|
||||
None
|
||||
} else {
|
||||
from_user::check_ptr(timeout_ts)?;
|
||||
let timeout_ts = unsafe { &*timeout_ts };
|
||||
Some(timeout_ts.as_duration())
|
||||
};
|
||||
if !sigmask.is_null() {
|
||||
warn!("ppoll sigmask is not supported!");
|
||||
}
|
||||
do_poll_common(fds, nfds, timeout.as_mut(), None)
|
||||
}
|
||||
|
||||
pub fn do_poll(fds: *mut libc::pollfd, nfds: libc::nfds_t, timeout_ms: c_int) -> Result<isize> {
|
||||
let mut timeout = if timeout_ms >= 0 {
|
||||
Some(Duration::from_millis(timeout_ms as u64))
|
||||
} else {
|
||||
None
|
||||
};
|
||||
do_poll_common(fds, nfds, timeout.as_mut(), None)
|
||||
}
|
||||
|
||||
fn do_poll_common(
|
||||
fds: *mut libc::pollfd,
|
||||
nfds: libc::nfds_t,
|
||||
timeout: Option<&mut Duration>,
|
||||
sigmask: Option<SigSet>,
|
||||
) -> Result<isize> {
|
||||
// It behaves like sleep when fds is null and nfds is zero.
|
||||
if !fds.is_null() || nfds != 0 {
|
||||
from_user::check_mut_array(fds, nfds as usize)?;
|
||||
@ -737,13 +771,7 @@ pub fn do_poll(fds: *mut libc::pollfd, nfds: libc::nfds_t, timeout_ms: c_int) ->
|
||||
.map(|raw| PollFd::from_raw(raw))
|
||||
.collect();
|
||||
|
||||
let mut timeout = if timeout_ms >= 0 {
|
||||
Some(Duration::from_millis(timeout_ms as u64))
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
let count = io_multiplexing::do_poll_new(&poll_fds, timeout.as_mut())?;
|
||||
let count = io_multiplexing::do_poll_new(&poll_fds, timeout)?;
|
||||
|
||||
for (raw_poll_fd, poll_fd) in raw_poll_fds.iter_mut().zip(poll_fds.iter()) {
|
||||
raw_poll_fd.revents = poll_fd.revents().get().to_raw() as i16;
|
||||
|
@ -38,8 +38,8 @@ use crate::misc::{resource_t, rlimit_t, sysinfo_t, utsname_t, RandFlags};
|
||||
use crate::net::{
|
||||
do_accept, do_accept4, do_bind, do_connect, do_epoll_create, do_epoll_create1, do_epoll_ctl,
|
||||
do_epoll_pwait, do_epoll_wait, do_getpeername, do_getsockname, do_getsockopt, do_listen,
|
||||
do_poll, do_recvfrom, do_recvmsg, do_select, do_sendmmsg, do_sendmsg, do_sendto, do_setsockopt,
|
||||
do_shutdown, do_socket, do_socketpair, mmsghdr, msghdr, msghdr_mut,
|
||||
do_poll, do_ppoll, do_recvfrom, do_recvmsg, do_select, do_sendmmsg, do_sendmsg, do_sendto,
|
||||
do_setsockopt, do_shutdown, do_socket, do_socketpair, mmsghdr, msghdr, msghdr_mut,
|
||||
};
|
||||
use crate::process::{
|
||||
do_arch_prctl, do_clone, do_execve, do_exit, do_exit_group, do_futex, do_get_robust_list,
|
||||
@ -359,7 +359,7 @@ macro_rules! process_syscall_table_with_callback {
|
||||
(Fchmodat = 268) => do_fchmodat(dirfd: i32, path: *const i8, mode: u16),
|
||||
(Faccessat = 269) => do_faccessat(dirfd: i32, path: *const i8, mode: u32, flags: u32),
|
||||
(Pselect6 = 270) => handle_unsupported(),
|
||||
(Ppoll = 271) => handle_unsupported(),
|
||||
(Ppoll = 271) => do_ppoll(fds: *mut libc::pollfd, nfds: libc::nfds_t, timeout_ts: *const timespec_t, sigmask: *const sigset_t),
|
||||
(Unshare = 272) => handle_unsupported(),
|
||||
(SetRobustList = 273) => do_set_robust_list(list_head_ptr: *mut RobustListHead, len: usize),
|
||||
(GetRobustList = 274) => do_get_robust_list(tid: pid_t, list_head_ptr_ptr: *mut *mut RobustListHead, len_ptr: *mut usize),
|
||||
|
Loading…
Reference in New Issue
Block a user