ioloop-epoll.c revision 720692523ece4a549f7c589508d5693ee310f6b3
f877ee033a0737100c2f661a7ca4c559ea2ddb8aTimo Sirainen * Linux epoll() based ioloop handler.
f877ee033a0737100c2f661a7ca4c559ea2ddb8aTimo Sirainen * Copyright (c) 2004 Andrey Panin <pazke@donpac.ru>
f877ee033a0737100c2f661a7ca4c559ea2ddb8aTimo Sirainen * This software is released under the MIT license.
f877ee033a0737100c2f661a7ca4c559ea2ddb8aTimo Sirainenvoid io_loop_handler_init(struct ioloop *ioloop)
f877ee033a0737100c2f661a7ca4c559ea2ddb8aTimo Sirainen p_new(ioloop->pool, struct ioloop_handler_context, 1);
f877ee033a0737100c2f661a7ca4c559ea2ddb8aTimo Sirainen p_array_init(&ctx->events, ioloop->pool, IOLOOP_INITIAL_FD_COUNT);
f877ee033a0737100c2f661a7ca4c559ea2ddb8aTimo Sirainen p_array_init(&ctx->fd_index, ioloop->pool, IOLOOP_INITIAL_FD_COUNT);
f877ee033a0737100c2f661a7ca4c559ea2ddb8aTimo Sirainen ctx->epfd = epoll_create(IOLOOP_INITIAL_FD_COUNT);
f877ee033a0737100c2f661a7ca4c559ea2ddb8aTimo Sirainenvoid io_loop_handler_deinit(struct ioloop *ioloop)
f877ee033a0737100c2f661a7ca4c559ea2ddb8aTimo Sirainen struct ioloop_handler_context *ctx = ioloop->handler_context;
f877ee033a0737100c2f661a7ca4c559ea2ddb8aTimo Sirainen unsigned int i, count;
f877ee033a0737100c2f661a7ca4c559ea2ddb8aTimo Sirainen list = array_get_modifyable(&ctx->fd_index, &count);
f877ee033a0737100c2f661a7ca4c559ea2ddb8aTimo Sirainen for (i = 0; i < count; i++)
f877ee033a0737100c2f661a7ca4c559ea2ddb8aTimo Sirainen array_free(&ioloop->handler_context->fd_index);
f877ee033a0737100c2f661a7ca4c559ea2ddb8aTimo Sirainen p_free(ioloop->pool, ioloop->handler_context);
906520ee2cece20c875835697db08cd5e29b919bTimo Sirainen#define IO_EPOLL_INPUT (EPOLLIN | EPOLLPRI | IO_EPOLL_ERROR)
3efdcb59492bd1e0602340a4204003a32b34654aTimo Sirainen#define IO_EPOLL_OUTPUT (EPOLLOUT | IO_EPOLL_ERROR)
906520ee2cece20c875835697db08cd5e29b919bTimo Sirainenstatic int epoll_event_mask(struct io_list *list)
3efdcb59492bd1e0602340a4204003a32b34654aTimo Sirainen for (i = 0; i < IOLOOP_IOLIST_IOS_PER_FD; i++) {
f877ee033a0737100c2f661a7ca4c559ea2ddb8aTimo Sirainenvoid io_loop_handle_add(struct ioloop *ioloop, struct io *io)
3efdcb59492bd1e0602340a4204003a32b34654aTimo Sirainen struct ioloop_handler_context *ctx = ioloop->handler_context;
int op;
bool first;
if (first) {
int op;
bool last;
if (last) {
bool call;
for (i = 0; i < ret; i++) {
for (j = 0; j < IOLOOP_IOLIST_IOS_PER_FD; j++) {
if (call) {