diff options
| author | Ruslan Ermilov <ru@nginx.com> | 2014-05-23 16:37:05 +0400 |
|---|---|---|
| committer | Ruslan Ermilov <ru@nginx.com> | 2014-05-23 16:37:05 +0400 |
| commit | 5c170306718a8fe5f606f7bdd2d492a54c1cf0ce (patch) | |
| tree | 0d7c14c86d7186f9dc5779a04ae8a532d9295883 /src | |
| parent | 3e279a8eb492ff903ccc46cf03bbd95a30a7dcf1 (diff) | |
| download | nginx-5c170306718a8fe5f606f7bdd2d492a54c1cf0ce.tar.gz nginx-5c170306718a8fe5f606f7bdd2d492a54c1cf0ce.tar.bz2 | |
Events: use eventfd() instead of syscall(SYS_eventfd) if possible.
This fixes --with-file-aio support on systems that lack eventfd()
syscall, notably aarch64 Linux.
The syscall(SYS_eventfd) may still be necessary on systems that
have eventfd() syscall in the kernel but lack it in glibc, e.g.
as seen in the current CentOS 5 release.
Diffstat (limited to 'src')
| -rw-r--r-- | src/event/modules/ngx_epoll_module.c | 8 | ||||
| -rw-r--r-- | src/os/unix/ngx_linux_config.h | 3 |
2 files changed, 7 insertions, 4 deletions
diff --git a/src/event/modules/ngx_epoll_module.c b/src/event/modules/ngx_epoll_module.c index f5f663179..a098c1c00 100644 --- a/src/event/modules/ngx_epoll_module.c +++ b/src/event/modules/ngx_epoll_module.c @@ -193,10 +193,6 @@ ngx_module_t ngx_epoll_module = { * We call io_setup(), io_destroy() io_submit(), and io_getevents() directly * as syscalls instead of libaio usage, because the library header file * supports eventfd() since 0.3.107 version only. - * - * Also we do not use eventfd() in glibc, because glibc supports it - * since 2.8 version and glibc maps two syscalls eventfd() and eventfd2() - * into single eventfd() function with different number of parameters. */ static int @@ -227,7 +223,11 @@ ngx_epoll_aio_init(ngx_cycle_t *cycle, ngx_epoll_conf_t *epcf) int n; struct epoll_event ee; +#if (NGX_HAVE_SYS_EVENTFD_H) + ngx_eventfd = eventfd(0, 0); +#else ngx_eventfd = syscall(SYS_eventfd, 0); +#endif if (ngx_eventfd == -1) { ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, diff --git a/src/os/unix/ngx_linux_config.h b/src/os/unix/ngx_linux_config.h index 72594bac0..c6c02c93e 100644 --- a/src/os/unix/ngx_linux_config.h +++ b/src/os/unix/ngx_linux_config.h @@ -94,6 +94,9 @@ extern ssize_t sendfile(int s, int fd, int32_t *offset, size_t size); #if (NGX_HAVE_FILE_AIO) +#if (NGX_HAVE_SYS_EVENTFD_H) +#include <sys/eventfd.h> +#endif #include <sys/syscall.h> #include <linux/aio_abi.h> typedef struct iocb ngx_aiocb_t; |
