mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 12:17:35 +00:00
LibC: Rewrite pselect() as a wrapper for ppoll()
This commit is contained in:
parent
2177c2a30b
commit
b840c8f68e
1 changed files with 51 additions and 3 deletions
|
@ -6,10 +6,13 @@
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <sys/poll.h>
|
||||||
#include <sys/select.h>
|
#include <sys/select.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <syscall.h>
|
#include <syscall.h>
|
||||||
|
|
||||||
|
#include <AK/Vector.h>
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
||||||
int select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, timeval* timeout_tv)
|
int select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, timeval* timeout_tv)
|
||||||
|
@ -25,8 +28,53 @@ int select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, timev
|
||||||
|
|
||||||
int pselect(int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, const timespec* timeout, const sigset_t* sigmask)
|
int pselect(int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, const timespec* timeout, const sigset_t* sigmask)
|
||||||
{
|
{
|
||||||
Syscall::SC_select_params params { nfds, readfds, writefds, exceptfds, timeout, sigmask };
|
Vector<pollfd, FD_SETSIZE> fds;
|
||||||
int rc = syscall(SC_select, ¶ms);
|
|
||||||
__RETURN_WITH_ERRNO(rc, rc, -1);
|
if (nfds < 0 || static_cast<size_t>(nfds) >= fds.capacity())
|
||||||
|
return EINVAL;
|
||||||
|
|
||||||
|
for (int fd = 0; fd < nfds; fd++) {
|
||||||
|
short events = 0;
|
||||||
|
if (readfds && FD_ISSET(fd, readfds))
|
||||||
|
events |= POLLIN;
|
||||||
|
if (writefds && FD_ISSET(fd, writefds))
|
||||||
|
events |= POLLOUT;
|
||||||
|
if (exceptfds && FD_ISSET(fd, exceptfds))
|
||||||
|
events |= POLLPRI;
|
||||||
|
if (!events)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
fds.unchecked_append({ fd, events, 0 });
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ppoll(fds.data(), fds.size(), timeout, sigmask) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (readfds)
|
||||||
|
FD_ZERO(readfds);
|
||||||
|
if (writefds)
|
||||||
|
FD_ZERO(writefds);
|
||||||
|
if (exceptfds)
|
||||||
|
FD_ZERO(exceptfds);
|
||||||
|
|
||||||
|
int marked_fd_count = 0;
|
||||||
|
for (auto& fd_entry : fds) {
|
||||||
|
if (fd_entry.revents == 0)
|
||||||
|
continue;
|
||||||
|
if (readfds && (fd_entry.revents & POLLIN)) {
|
||||||
|
FD_SET(fd_entry.fd, readfds);
|
||||||
|
marked_fd_count++;
|
||||||
|
}
|
||||||
|
if (writefds && (fd_entry.revents & POLLOUT)) {
|
||||||
|
FD_SET(fd_entry.fd, writefds);
|
||||||
|
marked_fd_count++;
|
||||||
|
}
|
||||||
|
if (exceptfds && (fd_entry.revents & (POLLPRI | POLLERR | POLLHUP))) {
|
||||||
|
FD_SET(fd_entry.fd, exceptfds);
|
||||||
|
marked_fd_count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return marked_fd_count;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue