From bac906c76119ed8c8915e3979160fac7e12eac05 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Fri, 10 Feb 2012 16:39:46 -0500 Subject: Prefer epoll_create1 on Linuxen that have it --- epoll.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) (limited to 'epoll.c') diff --git a/epoll.c b/epoll.c index f1219e7d..8dc2515d 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); -- cgit v1.2.1