]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
tevent: rely on epoll_create1() for epoll interface
authorDmitry Antipov <dantipov@cloudlinux.com>
Fri, 7 Apr 2023 11:47:15 +0000 (14:47 +0300)
committerAndreas Schneider <asn@cryptomilk.org>
Wed, 19 Jul 2023 08:02:33 +0000 (08:02 +0000)
Prefer epoll_create1(2) over epoll_create(2) and
always require the former to use epoll(7) interface,
thus saving extra fcntl(2) call to set FD_CLOEXEC.

Signed-off-by: Dmitry Antipov <dantipov@cloudlinux.com>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
Reviewed-by: Stefan Metzmacher <metze@samba.org>
lib/tevent/tevent_epoll.c
lib/tevent/wscript

index 1f1f47b2b21189d124997f950c2db11bb74ba310..ac8340118e967da5db01ecc8c96262f202600ab3 100644 (file)
@@ -36,7 +36,7 @@ struct epoll_event_context {
        /* a pointer back to the generic event_context */
        struct tevent_context *ev;
 
-       /* when using epoll this is the handle from epoll_create */
+       /* when using epoll this is the handle from epoll_create1(2) */
        int epoll_fd;
 
        pid_t pid;
@@ -53,11 +53,11 @@ struct epoll_event_context {
 
 #ifdef TEST_PANIC_FALLBACK
 
-static int epoll_create_panic_fallback(struct epoll_event_context *epoll_ev,
-                                      int size)
+static int epoll_create1_panic_fallback(struct epoll_event_context *epoll_ev,
+                                       int flags)
 {
        if (epoll_ev->panic_fallback == NULL) {
-               return epoll_create(size);
+               return epoll_create1(flags);
        }
 
        /* 50% of the time, fail... */
@@ -66,7 +66,7 @@ static int epoll_create_panic_fallback(struct epoll_event_context *epoll_ev,
                return -1;
        }
 
-       return epoll_create(size);
+       return epoll_create1(flags);
 }
 
 static int epoll_ctl_panic_fallback(struct epoll_event_context *epoll_ev,
@@ -105,8 +105,8 @@ static int epoll_wait_panic_fallback(struct epoll_event_context *epoll_ev,
        return epoll_wait(epfd, events, maxevents, timeout);
 }
 
-#define epoll_create(_size) \
-       epoll_create_panic_fallback(epoll_ev, _size)
+#define epoll_create1(_flags) \
+       epoll_create1_panic_fallback(epoll_ev, _flags)
 #define epoll_ctl(_epfd, _op, _fd, _event) \
        epoll_ctl_panic_fallback(epoll_ev,_epfd, _op, _fd, _event)
 #define epoll_wait(_epfd, _events, _maxevents, _timeout) \
@@ -194,18 +194,14 @@ static int epoll_ctx_destructor(struct epoll_event_context *epoll_ev)
 */
 static int epoll_init_ctx(struct epoll_event_context *epoll_ev)
 {
-       epoll_ev->epoll_fd = epoll_create(64);
+       epoll_ev->epoll_fd = epoll_create1(EPOLL_CLOEXEC);
        if (epoll_ev->epoll_fd == -1) {
                tevent_debug(epoll_ev->ev, TEVENT_DEBUG_FATAL,
-                            "Failed to create epoll handle.\n");
+                            "Failed to create epoll handle (%s).\n",
+                            strerror(errno));
                return -1;
        }
 
-       if (!ev_set_close_on_exec(epoll_ev->epoll_fd)) {
-               tevent_debug(epoll_ev->ev, TEVENT_DEBUG_WARNING,
-                            "Failed to set close-on-exec, file descriptor may be leaked to children.\n");
-       }
-
        epoll_ev->pid = tevent_cached_getpid();
        talloc_set_destructor(epoll_ev, epoll_ctx_destructor);
 
@@ -231,17 +227,12 @@ static void epoll_check_reopen(struct epoll_event_context *epoll_ev)
        }
 
        close(epoll_ev->epoll_fd);
-       epoll_ev->epoll_fd = epoll_create(64);
+       epoll_ev->epoll_fd = epoll_create1(EPOLL_CLOEXEC);
        if (epoll_ev->epoll_fd == -1) {
                epoll_panic(epoll_ev, "epoll_create() failed", false);
                return;
        }
 
-       if (!ev_set_close_on_exec(epoll_ev->epoll_fd)) {
-               tevent_debug(epoll_ev->ev, TEVENT_DEBUG_WARNING,
-                            "Failed to set close-on-exec, file descriptor may be leaked to children.\n");
-       }
-
        epoll_ev->pid = pid;
        epoll_ev->panic_state = &panic_triggered;
        for (fde=epoll_ev->ev->fd_events;fde;fde=fde->next) {
index 0f6e92f93e8392adc6934236ebce4198d9dfb241..bed4b6a80af65bad3a3def2d9756bd317a5d9d24 100644 (file)
@@ -51,7 +51,7 @@ def configure(conf):
                 conf.CHECK_BUNDLED_SYSTEM_PYTHON('pytevent', 'tevent', minversion=VERSION):
                 conf.define('USING_SYSTEM_PYTEVENT', 1)
 
-    if conf.CHECK_FUNCS('epoll_create', headers='sys/epoll.h'):
+    if conf.CHECK_FUNCS('epoll_create1', headers='sys/epoll.h'):
         conf.DEFINE('HAVE_EPOLL', 1)
 
     tevent_num_signals = 64