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;
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;
if (errno == EINTR)
continue;
- return -1;
+ return -errno;
}
for (i = 0; i < nfds; i++) {
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;
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)
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);
}
}
- 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;
iterator = next;
}
- if (descr->epfd >= 0)
- return close(descr->epfd);
-
- return 0;
+ close_prot_errno_disarm(descr->epfd);
}
#include <stdint.h>
#include "list.h"
+#include "memory_utils.h"
#define LXC_MAINLOOP_ERROR -1
#define LXC_MAINLOOP_CONTINUE 0
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