return 0;
}
- if (!descr->nfds)
+ if (lxc_list_empty(&descr->handlers))
return 0;
}
}
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)
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;
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);
}