void *mk_epoll_init(int efd, mk_epoll_handlers * handler, int max_events) { int i, fd, ret = -1; int num_fds; int fds_timeout; struct epoll_event *events; struct sched_list_node *sched; /* Get thread conf */ sched = mk_sched_get_thread_conf(); fds_timeout = log_current_utime + config->timeout; events = mk_mem_malloc_z(max_events*sizeof(struct epoll_event)); while (1) { ret = -1; num_fds = epoll_wait(efd, events, max_events, MK_EPOLL_WAIT_TIMEOUT); for (i = 0; i < num_fds; i++) { fd = events[i].data.fd; if (events[i].events & EPOLLIN) { MK_TRACE("[FD %i] EPoll Event READ", fd); ret = (*handler->read) (fd); } else if (events[i].events & EPOLLOUT) { MK_TRACE("[FD %i] EPoll Event WRITE", fd); ret = (*handler->write) (fd); } else if (events[i].events & (EPOLLHUP | EPOLLERR | EPOLLRDHUP)) { MK_TRACE("[FD %i] EPoll Event EPOLLHUP/EPOLLER", fd); ret = (*handler->error) (fd); } if (ret < 0) { MK_TRACE("[FD %i] Epoll Event FORCE CLOSE | ret = %i", fd, ret); (*handler->close) (fd); } } /* Check timeouts and update next one */ if (log_current_utime >= fds_timeout) { mk_sched_check_timeouts(sched); fds_timeout = log_current_utime + config->timeout; } } }
int mk_conn_timeout(int socket) { int ret = -1; struct sched_list_node *sched; MK_TRACE("[FD %i] Connection Handler, timeout", socket); /* Plugin hook */ ret = mk_plugin_event_timeout(socket); switch(ret) { case MK_PLUGIN_RET_EVENT_OWNED: return MK_PLUGIN_RET_CONTINUE; case MK_PLUGIN_RET_EVENT_CLOSE: return -1; case MK_PLUGIN_RET_EVENT_CONTINUE: break; /* just return controller to invoker */ } sched = mk_sched_get_thread_conf(); mk_sched_check_timeouts(sched); return 0; }