Арены я починил, я просто забывал при ошибке из сокета возвращать указатель на буфер. А вот ошибка с вечно раздувающимся массивом кэша ивентов, которую я ещё в старой имплементации отдебажить так и не смог, осталась. Кажется, сейчас будет интересно
Но, кстати, я нашёл какое-то сообщение в рассылке линукса на тему edge-triggered режима еполла. Там упоминалось в том числе и то, что практически все всё равно используют кэш ивентов. Потому что, как известно, edge-triggered режим обозначает как раз то, что будут приходить оповещения о сокетах только тогда, когда их состояние меняется. В данном случае, состояний два - сокет полностью вычитан/буфер записи забит, и тут в нём появляется что-то новое/появляется достаточно места в буфере для записи. То есть, получив условно единожды ивент о том, что такой-то сокет доступен на чтение, до тех пор, пока ты не дочитаешь до ошибки EAGAIN (данных больше не осталось, read buffer is exhausted) - снова тебе этот ивент не прилетит.
Собственно, держать где-то рядышком структуру данных, где все доступные для какой-либо из операций сокеты, и называется кэшем ивентов. А сказано было, что только так обычно и достигают highly efficient I/O. Значит, я на правильном пути
Post #322
167