void loop_epoll(server_t *server) { int epollfd = epoll_create1(0); if (epollfd == -1) err_exit("epoll_create1"); add_to_epoll(epollfd, server->listen_fd); struct epoll_event *events = calloc(LOOP_EPOLL_MAXEVENTS, sizeof(struct epoll_event)); while (!server->quit) { int n = epoll_wait(epollfd, events, LOOP_EPOLL_MAXEVENTS, -1); int i; for (i = 0; i < n; i++) { if ((events[i].events & EPOLLERR) || (events[i].events & EPOLLHUP) || (!(events[i].events & EPOLLIN))) { err_message("epoll error, closing %d\n", events[i].data.fd); close(events[i].data.fd); continue; } else if (server->listen_fd == events[i].data.fd) { /* incoming connections. */ struct sockaddr addr; socklen_t in_len = sizeof addr; int newfd = accept(server->listen_fd, &addr, &in_len); printf("Accepted connection on descriptor %d ", newfd); add_to_epoll(epollfd, newfd); } else { /* incoming data */ command_t command = get_next_command(events[i].data.fd); process_command(server, &command); } } } free(events); close(server->listen_fd); }
int create_timer(int interval_value , int epoll_fd) { int timer_fd = timerfd_create(CLOCK_REALTIME , 0); if(timer_fd < 0) { LOG_ERROR("In create_timer : timerfd_create error : %s" , STR_ERROR); return -1; } struct timespec interval; interval.tv_sec = interval_value; interval.tv_nsec = 0; struct itimerspec spec; spec.it_value = interval; spec.it_interval = interval; if(timerfd_settime(timer_fd , TFD_TIMER_ABSTIME , &spec , NULL) < 0) { LOG_ERROR("In create_timer : timerfd_settime error : %s" , STR_ERROR); close(timer_fd); return -1; } if(add_to_epoll(epoll_fd , timer_fd , EPOLLIN , NULL) < 0) { LOG_ERROR("In create_timer : all timer %d to epoll error !" , timer_fd); close(timer_fd); return -1; } return timer_fd; }