From bac906c76119ed8c8915e3979160fac7e12eac05 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Fri, 10 Feb 2012 16:39:46 -0500 Subject: [PATCH] Prefer epoll_create1 on Linuxen that have it --- configure.in | 1 + epoll.c | 23 ++++++++++++++--------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/configure.in b/configure.in index 021f97c07e..8c7e3e9847 100644 --- a/configure.in +++ b/configure.in @@ -310,6 +310,7 @@ AC_CHECK_FUNCS([ \ arc4random_buf \ clock_gettime \ eventfd \ + epoll_create1 \ fcntl \ getegid \ geteuid \ diff --git a/epoll.c b/epoll.c index f1219e7dfb..8dc2515d0a 100644 --- a/epoll.c +++ b/epoll.c @@ -108,19 +108,24 @@ const struct eventop epollops = { static void * epoll_init(struct event_base *base) { - int epfd; + int epfd = -1; struct epollop *epollop; - /* Initialize the kernel queue. (The size field is ignored since - * 2.6.8.) */ - if ((epfd = epoll_create(32000)) == -1) { - if (errno != ENOSYS) - event_warn("epoll_create"); - return (NULL); +#ifdef _EVENT_HAVE_EPOLL_CREATE1 + /* First, try the shiny new epoll_create1 interface, if we have it. */ + epfd = epoll_create1(EPOLL_CLOEXEC); +#endif + if (epfd == -1) { + /* Initialize the kernel queue using the old interface. (The + size field is ignored since 2.6.8.) */ + if ((epfd = epoll_create(32000)) == -1) { + if (errno != ENOSYS) + event_warn("epoll_create"); + return (NULL); + } + evutil_make_socket_closeonexec(epfd); } - evutil_make_socket_closeonexec(epfd); - if (!(epollop = mm_calloc(1, sizeof(struct epollop)))) { close(epfd); return (NULL);