io-util: introduce ppoll_usec() helper function

This commit is contained in:
Yu Watanabe
2021-03-03 03:55:22 +09:00
parent 1d61d70abb
commit c4febde9d0
2 changed files with 30 additions and 11 deletions

View File

@@ -2,7 +2,6 @@
#include <errno.h>
#include <limits.h>
#include <poll.h>
#include <stdio.h>
#include <unistd.h>
@@ -159,24 +158,42 @@ int pipe_eof(int fd) {
return !!(r & POLLHUP);
}
int fd_wait_for_event(int fd, int event, usec_t t) {
struct pollfd pollfd = {
.fd = fd,
.events = event,
};
int ppoll_usec(struct pollfd *fds, size_t nfds, usec_t timeout) {
struct timespec ts;
int r;
r = ppoll(&pollfd, 1, t == USEC_INFINITY ? NULL : timespec_store(&ts, t), NULL);
assert(fds || nfds == 0);
if (nfds == 0)
return 0;
r = ppoll(fds, nfds, timeout == USEC_INFINITY ? NULL : timespec_store(&ts, timeout), NULL);
if (r < 0)
return -errno;
if (r == 0)
return 0;
if (pollfd.revents & POLLNVAL)
return -EBADF;
for (size_t i = 0, n = r; i < nfds && n > 0; i++) {
if (fds[i].revents == 0)
continue;
if (fds[i].revents & POLLNVAL)
return -EBADF;
n--;
}
return r;
}
int fd_wait_for_event(int fd, int event, usec_t timeout) {
struct pollfd pollfd = {
.fd = fd,
.events = event,
};
int r;
r = ppoll_usec(&pollfd, 1, timeout);
if (r <= 0)
return r;
return pollfd.revents;
}

View File

@@ -1,6 +1,7 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#pragma once
#include <poll.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
@@ -18,6 +19,7 @@ int loop_write(int fd, const void *buf, size_t nbytes, bool do_poll);
int pipe_eof(int fd);
int ppoll_usec(struct pollfd *fds, size_t nfds, usec_t timeout);
int fd_wait_for_event(int fd, int event, usec_t timeout);
ssize_t sparse_write(int fd, const void *p, size_t sz, size_t run_length);