linux: try epoll_pwait if epoll_wait is missing
It seems that epoll_wait is implemented in glibc in terms of epoll_pwait and new architectures (like arm64) do not implement the epoll_wait syscall at all. So if epoll_wait errors with ENOSYS, just call epoll_pwait.
This commit is contained in:
parent
5ccdfc568d
commit
861de3d71d
@ -149,6 +149,7 @@ void uv__io_poll(uv_loop_t* loop, int timeout) {
|
|||||||
int fd;
|
int fd;
|
||||||
int op;
|
int op;
|
||||||
int i;
|
int i;
|
||||||
|
static int no_epoll_wait;
|
||||||
|
|
||||||
if (loop->nfds == 0) {
|
if (loop->nfds == 0) {
|
||||||
assert(QUEUE_EMPTY(&loop->watcher_queue));
|
assert(QUEUE_EMPTY(&loop->watcher_queue));
|
||||||
@ -195,10 +196,22 @@ void uv__io_poll(uv_loop_t* loop, int timeout) {
|
|||||||
count = 48; /* Benchmarks suggest this gives the best throughput. */
|
count = 48; /* Benchmarks suggest this gives the best throughput. */
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
nfds = uv__epoll_wait(loop->backend_fd,
|
if (!no_epoll_wait) {
|
||||||
events,
|
nfds = uv__epoll_wait(loop->backend_fd,
|
||||||
ARRAY_SIZE(events),
|
events,
|
||||||
timeout);
|
ARRAY_SIZE(events),
|
||||||
|
timeout);
|
||||||
|
if (nfds == -1 && errno == ENOSYS) {
|
||||||
|
no_epoll_wait = 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
nfds = uv__epoll_pwait(loop->backend_fd,
|
||||||
|
events,
|
||||||
|
ARRAY_SIZE(events),
|
||||||
|
timeout,
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
|
|
||||||
/* Update loop->time unconditionally. It's tempting to skip the update when
|
/* Update loop->time unconditionally. It's tempting to skip the update when
|
||||||
* timeout == 0 (i.e. non-blocking poll) but there is no guarantee that the
|
* timeout == 0 (i.e. non-blocking poll) but there is no guarantee that the
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user