Сохранение списка сокетов, отсортированного по времени, оставшемуся до истечения времени ожидания (если период ожидания одинаков для всех сокетов, то это эквивалентно сортировке их по времени последнего полученного сообщения). Каждый раз, когда вы звоните epoll_wait()
, выбирайте сокет с наименьшим оставшимся временем до истечения времени ожидания (которое будет находиться в начале вашего списка). Используйте это время как время ожидания в epoll_wait()
.
Когда возвращается epoll_wait()
, после обработки любых активных сокетов просмотрите отсортированный список сокетов, удалив все просроченные (которые будут в начале отсортированного списка).
В epoll_wait()
время:
timeout = expirylist->expire_time - current_time();
n_events = epoll_wait(epfd, events, maxevents, timeout);
handle_events(events, n_events);
for (client = expirylist; client != NULL && client->expire_time < current_time(); client = client->expire_next)
{
do_timeout(client);
}