# Perf Этап 3 — recv parse-shortlist ## Что изменилось `do_parsepacket` каждый тик **брутфорсил все сессии** `1..fd_max`: косвенный вызов `func_parse` + `RFIFOFLUSH` на КАЖДОГО подключённого, даже если данных нет. epoll и так знает, у кого пришли данные. Теперь `recv_to_fifo` (срабатывает по epoll, когда данные реально пришли) кладёт fd в **parse-shortlist** (массив + флаг `in_parselist` для дедупа — зеркало `send_shortlist`). `do_parsepacket` идёт **только по этому списку**. fd остаётся в списке, пока в нём есть непрочитанные данные (частичный пакет ждёт «хвост»); при полном опустошении/eof — убирается; `recv_to_fifo` снова добавит его, когда придут новые данные. **Stall/idle-таймаут** (раньше проверялся в том же цикле на всех) вынесен в **отдельный проход раз в ~1 сек** по всем сессиям (idle-сессии в shortlist не попадают, поэтому таймаут нельзя держать в parse-цикле). Поведение-сохраняющее: парсятся ровно те же данные, просто без обхода «пустых» сессий. ## Флаг `conf/battle/misc.conf`: ``` recv_parse_shortlist: 1 // 1 (деф.) = парсить только fd с данными; 0 = старый полный обход ``` (battle_config; применяется map-сервером на старте. login/char используют дефолт 1.) ## Как замерить `UA_PERF=1`, ~300 онлайн, большая часть простаивает (типичный сервер): профиль `do_parsepacket` self% при `0` vs `1`. Ожидание: при `1` `do_parsepacket`/`RFIFOFLUSH`/indirect `func_parse` почти исчезают для idle-сессий (обходятся только активные fd). ## Чек-лист корректности - [ ] Логин/выход персонажей, смена карт — без «залипаний». - [ ] Все пакеты обрабатываются: чат, перемещение, атака, использование предметов/скиллов — без потерь. - [ ] **Частичные/склеенные пакеты**: медленный/фрагментированный ввод доходит и парсится (не теряется). - [ ] **Idle-таймаут работает**: «немой» клиент (получил данные, потом молчит дольше `stall_time`) отключается (как раньше) — но теперь проверка раз в ~1с (отключение может задержаться до ~1с — это ок). - [ ] Флуд/burst пакетов и буря реконнектов — обрабатываются штатно. - [ ] Межсерверный трафик (login↔char↔map) стабилен (карта поднимается онлайн, не отваливается). - [ ] `0` и `1` дают одинаковое игровое поведение (разница только в CPU). ## Откат `recv_parse_shortlist: 0` (или `@reloadbattleconf` если поддержано для socket-флагов; иначе рестарт map). Сборка чистая; локальный кластер поднимается онлайн (межсерверный recv/parse-путь проверен бустом).