|
50 | 50 | #define _kevent kevent |
51 | 51 | #endif |
52 | 52 | #elif defined(__linux__) |
| 53 | +#include <linux/version.h> |
53 | 54 | #include <sys/epoll.h> |
| 55 | +#include <poll.h> |
54 | 56 | #define USE_EPOLL |
| 57 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) |
| 58 | +#define HAVE_EPOLL_PWAIT2 |
| 59 | +#endif |
55 | 60 | #else |
56 | 61 | #include <poll.h> |
57 | 62 | #define USE_PPOLL |
@@ -925,24 +930,38 @@ eloop_run_kqueue(struct eloop *eloop, const struct timespec *ts) |
925 | 930 | static int |
926 | 931 | eloop_run_epoll(struct eloop *eloop, const struct timespec *ts) |
927 | 932 | { |
928 | | - int timeout, n, nn; |
| 933 | + int n, nn; |
929 | 934 | struct epoll_event *epe; |
930 | 935 | struct eloop_event *e; |
931 | 936 | unsigned short events; |
932 | 937 |
|
933 | | - if (ts != NULL) { |
934 | | - if (ts->tv_sec > INT_MAX / 1000 || |
935 | | - (ts->tv_sec == INT_MAX / 1000 && |
936 | | - ((ts->tv_nsec + 999999) / 1000000 > INT_MAX % 1000000))) |
937 | | - timeout = INT_MAX; |
938 | | - else |
939 | | - timeout = (int)(ts->tv_sec * 1000 + |
940 | | - (ts->tv_nsec + 999999) / 1000000); |
941 | | - } else |
942 | | - timeout = -1; |
| 938 | + /* epoll does not work with zero events */ |
| 939 | + if (eloop->nfds == 0) |
| 940 | + n = ppoll(NULL, 0, ts, &eloop->sigset); |
| 941 | + else |
| 942 | +#ifdef HAVE_EPOLL_PWAIT2 |
| 943 | + n = epoll_pwait2(eloop->fd, eloop->fds, (int)eloop->nfds, |
| 944 | + ts, &eloop->sigset); |
| 945 | +#else |
| 946 | + { |
| 947 | + int timeout; |
| 948 | + |
| 949 | + if (ts != NULL) { |
| 950 | + if (ts->tv_sec > INT_MAX / 1000 || |
| 951 | + (ts->tv_sec == INT_MAX / 1000 && |
| 952 | + ((ts->tv_nsec + 999999) / 1000000 > |
| 953 | + INT_MAX % 1000000))) |
| 954 | + timeout = INT_MAX; |
| 955 | + else |
| 956 | + timeout = (int)(ts->tv_sec * 1000 + |
| 957 | + (ts->tv_nsec + 999999) / 1000000); |
| 958 | + } else |
| 959 | + timeout = -1; |
943 | 960 |
|
944 | | - n = epoll_pwait(eloop->fd, eloop->fds, (int)eloop->nfds, timeout, |
945 | | - &eloop->sigset); |
| 961 | + n = epoll_pwait(eloop->fd, eloop->fds, (int)eloop->nfds, |
| 962 | + timeout, &eloop->sigset); |
| 963 | + } |
| 964 | +#endif |
946 | 965 | if (n == -1) |
947 | 966 | return -1; |
948 | 967 |
|
|
0 commit comments