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 fs::{CreationFlags, File, FileDesc, FileRef};
|
||||||
use misc::resource_t;
|
use misc::resource_t;
|
||||||
use process::Process;
|
use process::Process;
|
||||||
|
use signal::{sigset_t, SigSet};
|
||||||
use std::convert::TryFrom;
|
use std::convert::TryFrom;
|
||||||
use time::timeval_t;
|
use time::{timespec_t, timeval_t};
|
||||||
use util::mem_util::from_user;
|
use util::mem_util::from_user;
|
||||||
|
|
||||||
pub fn do_socket(domain: c_int, socket_type: c_int, protocol: c_int) -> Result<isize> {
|
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
|
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> {
|
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.
|
// It behaves like sleep when fds is null and nfds is zero.
|
||||||
if !fds.is_null() || nfds != 0 {
|
if !fds.is_null() || nfds != 0 {
|
||||||
from_user::check_mut_array(fds, nfds as usize)?;
|
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))
|
.map(|raw| PollFd::from_raw(raw))
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
let mut timeout = if timeout_ms >= 0 {
|
let count = io_multiplexing::do_poll_new(&poll_fds, timeout)?;
|
||||||
Some(Duration::from_millis(timeout_ms as u64))
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
};
|
|
||||||
|
|
||||||
let count = io_multiplexing::do_poll_new(&poll_fds, timeout.as_mut())?;
|
|
||||||
|
|
||||||
for (raw_poll_fd, poll_fd) in raw_poll_fds.iter_mut().zip(poll_fds.iter()) {
|
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;
|
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::{
|
use crate::net::{
|
||||||
do_accept, do_accept4, do_bind, do_connect, do_epoll_create, do_epoll_create1, do_epoll_ctl,
|
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_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_poll, do_ppoll, do_recvfrom, do_recvmsg, do_select, do_sendmmsg, do_sendmsg, do_sendto,
|
||||||
do_shutdown, do_socket, do_socketpair, mmsghdr, msghdr, msghdr_mut,
|
do_setsockopt, do_shutdown, do_socket, do_socketpair, mmsghdr, msghdr, msghdr_mut,
|
||||||
};
|
};
|
||||||
use crate::process::{
|
use crate::process::{
|
||||||
do_arch_prctl, do_clone, do_execve, do_exit, do_exit_group, do_futex, do_get_robust_list,
|
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),
|
(Fchmodat = 268) => do_fchmodat(dirfd: i32, path: *const i8, mode: u16),
|
||||||
(Faccessat = 269) => do_faccessat(dirfd: i32, path: *const i8, mode: u32, flags: u32),
|
(Faccessat = 269) => do_faccessat(dirfd: i32, path: *const i8, mode: u32, flags: u32),
|
||||||
(Pselect6 = 270) => handle_unsupported(),
|
(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(),
|
(Unshare = 272) => handle_unsupported(),
|
||||||
(SetRobustList = 273) => do_set_robust_list(list_head_ptr: *mut RobustListHead, len: usize),
|
(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),
|
(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