From: Clement Calmels Date: Wed, 13 Jan 2010 17:51:16 +0000 (+0100) Subject: Simplify mainloop X-Git-Tag: lxc-0.6.5~29 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d066f3b8e2c80e983308bbe2744ce5595c805ca8;p=thirdparty%2Flxc.git Simplify mainloop Just use a list instead of array for dynamically allocated stuff. It's more appropriated. Signed-off-by: Clement Calmels Signed-off-by: Daniel Lezcano --- diff --git a/src/lxc/mainloop.c b/src/lxc/mainloop.c index 6b656d13f..805c23b45 100644 --- a/src/lxc/mainloop.c +++ b/src/lxc/mainloop.c @@ -63,7 +63,7 @@ int lxc_mainloop(struct lxc_epoll_descr *descr) return 0; } - if (!descr->nfds) + if (lxc_list_empty(&descr->handlers)) return 0; } } @@ -71,8 +71,9 @@ int lxc_mainloop(struct lxc_epoll_descr *descr) int lxc_mainloop_add_handler(struct lxc_epoll_descr *descr, int fd, lxc_mainloop_callback_t callback, void *data) { - struct epoll_event *ev; + struct epoll_event ev; struct mainloop_handler *handler; + struct lxc_list *item; handler = malloc(sizeof(*handler)); if (!handler) @@ -82,63 +83,43 @@ int lxc_mainloop_add_handler(struct lxc_epoll_descr *descr, int fd, handler->fd = fd; handler->data = data; - ev = malloc(sizeof(*descr->ev) * (descr->nfds + 1)); - if (!ev) - goto out_free; + ev.events = EPOLLIN; + ev.data.ptr = handler; - 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; - ev[descr->nfds].data.ptr = handler; + item = malloc(sizeof(*item)); + if (!item) + goto out_free_handler; - if (epoll_ctl(descr->epfd, EPOLL_CTL_ADD, fd, &ev[descr->nfds]) < 0) { - free(ev); - goto out_free; - } - - free(descr->ev); - descr->ev = ev; - descr->nfds++; + item->elem = handler; + lxc_list_add(&descr->handlers, item); return 0; -out_free: +out_free_handler: free(handler); return -1; } int lxc_mainloop_del_handler(struct lxc_epoll_descr *descr, int fd) { - struct epoll_event *ev; struct mainloop_handler *handler; - int i, j, idx = 0; - - for (i = 0; i < descr->nfds; i++) { - - handler = descr->ev[i].data.ptr; + struct lxc_list *iterator; - if (handler->fd != fd) - continue; + lxc_list_for_each(iterator, &descr->handlers) { + handler = iterator->elem; - if (epoll_ctl(descr->epfd, EPOLL_CTL_DEL, fd, NULL)) - return -1; - - ev = malloc(sizeof(*ev) * (descr->nfds - 1)); - if (!ev) - return -1; + if (handler->fd == fd) { + /* found */ + if (epoll_ctl(descr->epfd, EPOLL_CTL_DEL, fd, NULL)) + return -1; - for (j = 0; j < descr->nfds; j++) { - if (i == j) - continue; - ev[idx] = descr->ev[j]; - idx++; + lxc_list_del(iterator); + free(iterator->elem); + free(iterator); + return 0; } - - free(descr->ev[i].data.ptr); - free(descr->ev); - descr->ev = ev; - descr->nfds--; - - return 0; } return -1; @@ -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) { - descr->nfds = 0; - descr->ev = NULL; - /* hint value passed to epoll create */ descr->epfd = epoll_create(2); if (descr->epfd < 0) return -1; + lxc_list_init(&descr->handlers); return 0; } int lxc_mainloop_close(struct lxc_epoll_descr *descr) { 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++) - free(descr->ev[i].data.ptr); - free(descr->ev); + lxc_list_del(iterator); + free(iterator->elem); + free(iterator); + iterator = next; + } return close(descr->epfd); } diff --git a/src/lxc/mainloop.h b/src/lxc/mainloop.h index aa17eb5b8..deeff2310 100644 --- a/src/lxc/mainloop.h +++ b/src/lxc/mainloop.h @@ -21,12 +21,11 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -struct epoll_event; +#include struct lxc_epoll_descr { int epfd; - int nfds; - struct epoll_event *ev; + struct lxc_list handlers; }; typedef int (*lxc_mainloop_callback_t)(int fd, void *data,