ioloop-epoll.c revision 193f5296d2a6b847970c222d8a261b89aae46331
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen * Linux epoll() based ioloop handler.
345648b341f228bd7f0b89f8aa3ecb9c470d817eTimo Sirainen * Copyright (c) 2004 Andrey Panin <pazke@donpac.ru>
d1414c09cf0d58ac983054e2f4e1a1f329272dcfTimo Sirainen * This software is released under the MIT license.
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainenvoid io_loop_handler_init(struct ioloop *ioloop)
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen ioloop->handler_context = ctx = i_new(struct ioloop_handler_context, 1);
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen i_array_init(&ctx->events, IOLOOP_INITIAL_FD_COUNT);
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen i_array_init(&ctx->fd_index, IOLOOP_INITIAL_FD_COUNT);
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen ctx->epfd = epoll_create(IOLOOP_INITIAL_FD_COUNT);
c57776c06ec99ba9b0dafdbf9475ea72ea8ca134Timo Sirainenvoid io_loop_handler_deinit(struct ioloop *ioloop)
d1414c09cf0d58ac983054e2f4e1a1f329272dcfTimo Sirainen struct ioloop_handler_context *ctx = ioloop->handler_context;
d1414c09cf0d58ac983054e2f4e1a1f329272dcfTimo Sirainen unsigned int i, count;
e70d5895795732b8247ab9abb045b438e954bc46Timo Sirainen list = array_get_modifiable(&ctx->fd_index, &count);
e70d5895795732b8247ab9abb045b438e954bc46Timo Sirainen for (i = 0; i < count; i++)
e70d5895795732b8247ab9abb045b438e954bc46Timo Sirainen array_free(&ioloop->handler_context->fd_index);
e70d5895795732b8247ab9abb045b438e954bc46Timo Sirainen#define IO_EPOLL_INPUT (EPOLLIN | EPOLLPRI | IO_EPOLL_ERROR)
e70d5895795732b8247ab9abb045b438e954bc46Timo Sirainen#define IO_EPOLL_OUTPUT (EPOLLOUT | IO_EPOLL_ERROR)
e70d5895795732b8247ab9abb045b438e954bc46Timo Sirainenstatic int epoll_event_mask(struct io_list *list)
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen for (i = 0; i < IOLOOP_IOLIST_IOS_PER_FD; i++) {
0469ed17dafcc56589ce00960a23f4f06817dfb5Timo Sirainen struct ioloop_handler_context *ctx = io->io.ioloop->handler_context;
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen list = array_idx_modifiable(&ctx->fd_index, io->fd);
if (first) {
int op;
bool last;
if (!closed) {
if (last) {
bool call;
for (i = 0; i < ret; i++) {
for (j = 0; j < IOLOOP_IOLIST_IOS_PER_FD; j++) {
if (call) {