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)
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);
}
......
......@@ -21,12 +21,11 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
struct epoll_event;
#include <list.h>
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,
......
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