Skip to content

Commit

Permalink
mainloop: cleanup
Browse files Browse the repository at this point in the history
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
  • Loading branch information
Christian Brauner committed Mar 20, 2020
1 parent 3e92b6f commit eafc1bb
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 31 deletions.
4 changes: 2 additions & 2 deletions src/lxc/cgroups/cgfsng.c
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
32 changes: 12 additions & 20 deletions src/lxc/mainloop.c
Expand Up @@ -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++) {
Expand Down Expand Up @@ -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;
Expand All @@ -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)
Expand All @@ -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);
Expand All @@ -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;

Expand All @@ -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);
}
12 changes: 3 additions & 9 deletions src/lxc/mainloop.h
Expand Up @@ -6,6 +6,7 @@
#include <stdint.h>

#include "list.h"
#include "memory_utils.h"

#define LXC_MAINLOOP_ERROR -1
#define LXC_MAINLOOP_CONTINUE 0
Expand All @@ -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

0 comments on commit eafc1bb

Please sign in to comment.