From: Christian Brauner Date: Fri, 20 Mar 2020 17:02:42 +0000 (+0100) Subject: mainloop: cleanup X-Git-Tag: lxc-4.0.0~9^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=eafc1bb6e60394c18cf4b8214e9fe30e1714d67c;p=thirdparty%2Flxc.git mainloop: cleanup Signed-off-by: Christian Brauner --- diff --git a/src/lxc/cgroups/cgfsng.c b/src/lxc/cgroups/cgfsng.c index 8edaa54c9..21abd910d 100644 --- a/src/lxc/cgroups/cgfsng.c +++ b/src/lxc/cgroups/cgfsng.c @@ -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; diff --git a/src/lxc/mainloop.c b/src/lxc/mainloop.c index 2ef5a93e6..6d4c5935a 100644 --- a/src/lxc/mainloop.c +++ b/src/lxc/mainloop.c @@ -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); } diff --git a/src/lxc/mainloop.h b/src/lxc/mainloop.h index a161d52aa..8afac60d3 100644 --- a/src/lxc/mainloop.h +++ b/src/lxc/mainloop.h @@ -6,6 +6,7 @@ #include #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