2.8 KiB
Устройство etcpmon
Действующие контракты и использование описаны в etcpmon_doc.md,
API — в etcpmon_client.h, etcpmon_gui.h, etcpmon_graph.h и etcpmon_protocol.h.
Серверная реализация: src/control_server.c/h и
control_server_doc.md.
WinMain создаёт etcpmon_app, инициализирует Winsock/классы окон, создаёт окно и запускает
message loop. Таймер GUI вызывает неблокирующий etcpmon_client_process(); фонового сетевого
потока нет. Client завершает connect, разбирает TCP-кадры, обновляет кеши и вызывает GUI callbacks.
Сэмпл истории добавляет только парсер ответа метрик; GUI отображает уже сохранённую историю.
Все команды клиента проходят через один TX FIFO с лимитом 64 КиБ/256 кадров и смещением досылки. Pending с ненулевым seq регистрируется вместе с кадром, но срок ответа начинается после полной отправки. Тип и payload ответа проверяются до снятия pending и вызова callback.
Сервер использует ll_queue с одним кадром до 32 КиБ и отдельным смещением частичной отправки.
Чтение/разбор команд ждут пустой очереди через отменяемый deferred waiter. Начальная подписка
хранит ID узлов и сериализует актуальную запись при освобождении TX; live-изменения объединяются
в ограниченном наборе из 256 ID. Переполнение отключает подписчика с диагностикой.
Перед освобождением клиента отменяются таймер и waiter, затем освобождаются снимок и очередь.
Метрики выдаются по запросу, а сообщения об узлах UTUN — только после явной подписки другого клиента;
сам GUI etcpmon подписку не использует.
Проверки клиента: make -C tools/etcpmon CC=x86_64-w64-mingw32-gcc TEST_RUNNER=wine check.
Проверки серверных очередей/cleanup/метрик: цель test_control_server из tests/Makefile.am.
Они проверяют разные стороны протокола и не заменяют интеграционный запуск клиента с сервером.