]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
mainloop: cleanup
authorChristian Brauner <christian.brauner@ubuntu.com>
Fri, 20 Mar 2020 17:02:42 +0000 (18:02 +0100)
committerChristian Brauner <christian.brauner@ubuntu.com>
Fri, 20 Mar 2020 17:02:42 +0000 (18:02 +0100)
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/cgroups/cgfsng.c
src/lxc/mainloop.c
src/lxc/mainloop.h

index 8edaa54c9f2537e998a81c255d33aa1463320229..21abd910dd8690109f484a7cef138f2ddaf7e040 100644 (file)
@@ -1913,7 +1913,7 @@ static int freezer_cgroup_events_cb(int fd, uint32_t events, void *cbdata,
 static int cg_unified_freeze(struct cgroup_ops *ops, int timeout)
 {
        __do_close int fd = -EBADF;
-       __do_lxc_mainloop_close struct lxc_epoll_descr *descr_ptr = NULL;
+       call_cleaner(lxc_mainloop_close) struct lxc_epoll_descr *descr_ptr = NULL;
        int ret;
        struct lxc_epoll_descr descr;
        struct hierarchy *h;
@@ -1981,7 +1981,7 @@ static int cg_legacy_unfreeze(struct cgroup_ops *ops)
 static int cg_unified_unfreeze(struct cgroup_ops *ops, int timeout)
 {
        __do_close int fd = -EBADF;
-       __do_lxc_mainloop_close struct lxc_epoll_descr *descr_ptr = NULL;
+       call_cleaner(lxc_mainloop_close)struct lxc_epoll_descr *descr_ptr = NULL;
        int ret;
        struct lxc_epoll_descr descr;
        struct hierarchy *h;
index 2ef5a93e6be48730b7fd764b129b68862ab1fc62..6d4c5935ae005332b1e4cd729364ef155b701218 100644 (file)
@@ -34,7 +34,7 @@ int lxc_mainloop(struct lxc_epoll_descr *descr, int timeout_ms)
                        if (errno == EINTR)
                                continue;
 
-                       return -1;
+                       return -errno;
                }
 
                for (i = 0; i < nfds; i++) {
@@ -62,9 +62,9 @@ int lxc_mainloop(struct lxc_epoll_descr *descr, int timeout_ms)
 int lxc_mainloop_add_handler(struct lxc_epoll_descr *descr, int fd,
                             lxc_mainloop_callback_t callback, void *data)
 {
+       __do_free struct mainloop_handler *handler = NULL;
+       __do_free struct lxc_list *item = NULL;
        struct epoll_event ev;
-       struct mainloop_handler *handler;
-       struct lxc_list *item;
 
        if (fd < 0)
                return -1;
@@ -81,19 +81,15 @@ int lxc_mainloop_add_handler(struct lxc_epoll_descr *descr, int fd,
        ev.data.ptr = handler;
 
        if (epoll_ctl(descr->epfd, EPOLL_CTL_ADD, fd, &ev) < 0)
-               goto out_free_handler;
+               return -errno;
 
        item = malloc(sizeof(*item));
        if (!item)
-               goto out_free_handler;
+               return ret_errno(ENOMEM);
 
-       item->elem = handler;
-       lxc_list_add(&descr->handlers, item);
+       item->elem = move_ptr(handler);
+       lxc_list_add(&descr->handlers, move_ptr(item));
        return 0;
-
-out_free_handler:
-       free(handler);
-       return -1;
 }
 
 int lxc_mainloop_del_handler(struct lxc_epoll_descr *descr, int fd)
@@ -107,7 +103,7 @@ int lxc_mainloop_del_handler(struct lxc_epoll_descr *descr, int fd)
                if (handler->fd == fd) {
                        /* found */
                        if (epoll_ctl(descr->epfd, EPOLL_CTL_DEL, fd, NULL))
-                               return -1;
+                               return -errno;
 
                        lxc_list_del(iterator);
                        free(iterator->elem);
@@ -116,21 +112,20 @@ int lxc_mainloop_del_handler(struct lxc_epoll_descr *descr, int fd)
                }
        }
 
-       return -1;
+       return ret_errno(EINVAL);
 }
 
 int lxc_mainloop_open(struct lxc_epoll_descr *descr)
 {
-       /* hint value passed to epoll create */
        descr->epfd = epoll_create1(EPOLL_CLOEXEC);
        if (descr->epfd < 0)
-               return -1;
+               return -errno;
 
        lxc_list_init(&descr->handlers);
        return 0;
 }
 
-int lxc_mainloop_close(struct lxc_epoll_descr *descr)
+void lxc_mainloop_close(struct lxc_epoll_descr *descr)
 {
        struct lxc_list *iterator, *next;
 
@@ -144,8 +139,5 @@ int lxc_mainloop_close(struct lxc_epoll_descr *descr)
                iterator = next;
        }
 
-       if (descr->epfd >= 0)
-               return close(descr->epfd);
-
-       return 0;
+       close_prot_errno_disarm(descr->epfd);
 }
index a161d52aad94aef5e4badad3aebee026348b5e27..8afac60d35e8552857c608f2644619231f9c246a 100644 (file)
@@ -6,6 +6,7 @@
 #include <stdint.h>
 
 #include "list.h"
+#include "memory_utils.h"
 
 #define LXC_MAINLOOP_ERROR -1
 #define LXC_MAINLOOP_CONTINUE 0
@@ -29,15 +30,8 @@ extern int lxc_mainloop_del_handler(struct lxc_epoll_descr *descr, int fd);
 
 extern int lxc_mainloop_open(struct lxc_epoll_descr *descr);
 
-extern int lxc_mainloop_close(struct lxc_epoll_descr *descr);
+extern void lxc_mainloop_close(struct lxc_epoll_descr *descr);
 
-static inline void __auto_lxc_mainloop_close__(struct lxc_epoll_descr **descr)
-{
-       if (*descr)
-               lxc_mainloop_close(*descr);
-}
-
-#define __do_lxc_mainloop_close \
-       __attribute__((__cleanup__(__auto_lxc_mainloop_close__)))
+define_cleanup_function(struct lxc_epoll_descr *, lxc_mainloop_close);
 
 #endif