/* Один планировщик на локальный экземпляр; handles владельцев не размножают пробы/выдачи. * tick вызывается общим stream network timer, destroy отменяет все свои receive/probe handles. */ #ifndef STREAM_OPTIMIZER_H #define STREAM_OPTIMIZER_H #include "stream.h" struct stream_optimizer; /* Только монотонное расписание; pending/active — незавершённый обход/пробы текущего цикла. * Возвращает допустимое число новых узлов, не адресов/субпотоков: 32 один раз, затем 0/1. */ struct stream_probe_schedule { uint64_t cycle, started_ms, next_ms; }; unsigned stream_probe_schedule_tick(struct stream_probe_schedule *schedule, uint64_t now_ms, unsigned pending, unsigned active); int stream_optimizer_create(struct UTUN_INSTANCE *inst, const struct stream_descriptor *descriptor, struct stream_optimizer **out); void stream_optimizer_destroy(struct stream_optimizer *optimizer); void stream_optimizer_tick(struct stream_optimizer *optimizer, struct STREAM_HANDLE *subscription, uint64_t now_ms); int stream_optimizer_configure(struct stream_optimizer *optimizer, const struct stream_selection_settings *settings); void stream_optimizer_info(struct stream_optimizer *optimizer, struct stream_selection_info *info); #endif