#include "SDL_internal.h"
#include "SDL_poll.h"
#include <poll.h>
#include <errno.h>
#ifdef HAVE_PPOLL
#include <time.h>
#endif
int SDL_IOReady(int fd, int flags, Sint64 timeoutNS)
{
int result;
SDL_assert(flags & (SDL_IOR_READ | SDL_IOR_WRITE));
do {
struct pollfd info;
info.fd = fd;
info.events = 0;
if (flags & SDL_IOR_READ) {
info.events |= POLLIN | POLLPRI;
}
if (flags & SDL_IOR_WRITE) {
info.events |= POLLOUT;
}
#ifdef HAVE_PPOLL
struct timespec *timeout = NULL;
struct timespec ts;
if (timeoutNS >= 0) {
ts.tv_sec = SDL_NS_TO_SECONDS(timeoutNS);
ts.tv_nsec = timeoutNS - SDL_SECONDS_TO_NS(ts.tv_sec);
timeout = &ts;
}
result = ppoll(&info, 1, timeout, NULL);
#else
int timeoutMS;
if (timeoutNS > 0) {
timeoutMS = (int)SDL_NS_TO_MS(timeoutNS + (SDL_NS_PER_MS - 1));
} else if (timeoutNS == 0) {
timeoutMS = 0;
} else {
timeoutMS = -1;
}
result = poll(&info, 1, timeoutMS);
#endif
} while (result < 0 && errno == EINTR && !(flags & SDL_IOR_NO_RETRY));
return result;
}