Commit d066f3b8 by Clement Calmels Committed by Daniel Lezcano

Simplify mainloop

Just use a list instead of array for dynamically allocated stuff. It's more appropriated. Signed-off-by: 's avatarClement Calmels <clement.calmels@fr.ibm.com> Signed-off-by: 's avatarDaniel Lezcano <dlezcano@fr.ibm.com>
parent 5df6b18f
...@@ -63,7 +63,7 @@ int lxc_mainloop(struct lxc_epoll_descr *descr) ...@@ -63,7 +63,7 @@ int lxc_mainloop(struct lxc_epoll_descr *descr)
return 0; return 0;
} }
if (!descr->nfds) if (lxc_list_empty(&descr->handlers))
return 0; return 0;
} }
} }
...@@ -71,8 +71,9 @@ int lxc_mainloop(struct lxc_epoll_descr *descr) ...@@ -71,8 +71,9 @@ int lxc_mainloop(struct lxc_epoll_descr *descr)
int lxc_mainloop_add_handler(struct lxc_epoll_descr *descr, int fd, int lxc_mainloop_add_handler(struct lxc_epoll_descr *descr, int fd,
lxc_mainloop_callback_t callback, void *data) lxc_mainloop_callback_t callback, void *data)
{ {
struct epoll_event *ev; struct epoll_event ev;
struct mainloop_handler *handler; struct mainloop_handler *handler;
struct lxc_list *item;
handler = malloc(sizeof(*handler)); handler = malloc(sizeof(*handler));
if (!handler) if (!handler)
...@@ -82,63 +83,43 @@ int lxc_mainloop_add_handler(struct lxc_epoll_descr *descr, int fd, ...@@ -82,63 +83,43 @@ int lxc_mainloop_add_handler(struct lxc_epoll_descr *descr, int fd,
handler->fd = fd; handler->fd = fd;
handler->data = data; handler->data = data;
ev = malloc(sizeof(*descr->ev) * (descr->nfds + 1)); ev.events = EPOLLIN;
if (!ev) ev.data.ptr = handler;
goto out_free;
memcpy(ev, descr->ev, sizeof(*descr->ev) * (descr->nfds)); if (epoll_ctl(descr->epfd, EPOLL_CTL_ADD, fd, &ev) < 0)
goto out_free_handler;
ev[descr->nfds].events = EPOLLIN; item = malloc(sizeof(*item));
ev[descr->nfds].data.ptr = handler; if (!item)
goto out_free_handler;
if (epoll_ctl(descr->epfd, EPOLL_CTL_ADD, fd, &ev[descr->nfds]) < 0) { item->elem = handler;
free(ev); lxc_list_add(&descr->handlers, item);
goto out_free;
}
free(descr->ev);
descr->ev = ev;
descr->nfds++;
return 0; return 0;
out_free: out_free_handler:
free(handler); free(handler);
return -1; return -1;
} }
int lxc_mainloop_del_handler(struct lxc_epoll_descr *descr, int fd) int lxc_mainloop_del_handler(struct lxc_epoll_descr *descr, int fd)
{ {
struct epoll_event *ev;
struct mainloop_handler *handler; struct mainloop_handler *handler;
int i, j, idx = 0; struct lxc_list *iterator;
for (i = 0; i < descr->nfds; i++) {
handler = descr->ev[i].data.ptr;
if (handler->fd != fd) lxc_list_for_each(iterator, &descr->handlers) {
continue; handler = iterator->elem;
if (epoll_ctl(descr->epfd, EPOLL_CTL_DEL, fd, NULL)) if (handler->fd == fd) {
return -1; /* found */
if (epoll_ctl(descr->epfd, EPOLL_CTL_DEL, fd, NULL))
ev = malloc(sizeof(*ev) * (descr->nfds - 1)); return -1;
if (!ev)
return -1;
for (j = 0; j < descr->nfds; j++) { lxc_list_del(iterator);
if (i == j) free(iterator->elem);
continue; free(iterator);
ev[idx] = descr->ev[j]; return 0;
idx++;
} }
free(descr->ev[i].data.ptr);
free(descr->ev);
descr->ev = ev;
descr->nfds--;
return 0;
} }
return -1; return -1;
...@@ -146,24 +127,29 @@ int lxc_mainloop_del_handler(struct lxc_epoll_descr *descr, int fd) ...@@ -146,24 +127,29 @@ int lxc_mainloop_del_handler(struct lxc_epoll_descr *descr, int fd)
int lxc_mainloop_open(struct lxc_epoll_descr *descr) int lxc_mainloop_open(struct lxc_epoll_descr *descr)
{ {
descr->nfds = 0;
descr->ev = NULL;
/* hint value passed to epoll create */ /* hint value passed to epoll create */
descr->epfd = epoll_create(2); descr->epfd = epoll_create(2);
if (descr->epfd < 0) if (descr->epfd < 0)
return -1; return -1;
lxc_list_init(&descr->handlers);
return 0; return 0;
} }
int lxc_mainloop_close(struct lxc_epoll_descr *descr) int lxc_mainloop_close(struct lxc_epoll_descr *descr)
{ {
int i; int i;
struct lxc_list *iterator, *next;
iterator = descr->handlers.next;
while (iterator != &descr->handlers) {
next = iterator->next;
for (i = 0; i < descr->nfds; i++) lxc_list_del(iterator);
free(descr->ev[i].data.ptr); free(iterator->elem);
free(descr->ev); free(iterator);
iterator = next;
}
return close(descr->epfd); return close(descr->epfd);
} }
......
...@@ -21,12 +21,11 @@ ...@@ -21,12 +21,11 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
struct epoll_event; #include <list.h>
struct lxc_epoll_descr { struct lxc_epoll_descr {
int epfd; int epfd;
int nfds; struct lxc_list handlers;
struct epoll_event *ev;
}; };
typedef int (*lxc_mainloop_callback_t)(int fd, void *data, typedef int (*lxc_mainloop_callback_t)(int fd, void *data,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment