standby.h/c: duty-cycle ACTIVE/SLEEP, standby_wait() будит в burst сразу, в SLEEP — до следующего burst; notify_network_activity для раннего пробуждения. Интеграция (по флагу UTUN_HAVE_STANDBY, десктоп без изменений): - conn_mgr: bg_ping/candidate_ping в SLEEP defer через standby_wait - route_connectivity: probe_node откладывается (PROBE_STATUS_DEFERRED) - topo_group_connect: пауза между попытками — активный режим 1с, фон standby_wait - jni_bridge/ConfigProvider/NetworkActivityMonitor: set_active + сетевая активность - chat_setting: standby_active_sec/sleep_sec/min_sleep_sec + юнит-тест test_standby (31 проверок)
62 lines
3.0 KiB
C
62 lines
3.0 KiB
C
/*
|
||
* standby.h — режим standby с duty-cycle (активный/неактивный интервалы)
|
||
*
|
||
* Для chatgui-android: когда приложение в фоне, вместо постоянной работы
|
||
* узел периодически просыпается: ACTIVE (X сек) → SLEEP (Y сек) → ACTIVE ...
|
||
*
|
||
* Потребители периодической работы используют standby_wait(): колбэк
|
||
* срабатывает на старте следующего активного интервала, а при выходе из
|
||
* standby (приложение вернулось в форграунд) — немедленно.
|
||
*/
|
||
#ifndef STANDBY_H
|
||
#define STANDBY_H
|
||
|
||
#include "u_async.h"
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
struct UTUN_INSTANCE;
|
||
|
||
/* Привязать модуль к uasync. Вызывается после каждого uasync_create(). */
|
||
void standby_init(struct UASYNC* ua);
|
||
|
||
/* Отмена таймеров и освобождение пула (без вызова колбэков). */
|
||
void standby_deinit(void);
|
||
|
||
/* Включить/выключить standby-режим. Логирует вход/выход (GENERAL info)
|
||
* и вызывает switch-callback. Флаг дублируется в inst->standby_enabled. */
|
||
void standby_set_enabled(struct UTUN_INSTANCE* inst, int enabled);
|
||
int standby_is_enabled(void);
|
||
|
||
/* Колбэк, вызываемый при каждом переключении standby-режима. */
|
||
void standby_set_switch_callback(void (*cb)(int enabled, void* arg), void* arg);
|
||
|
||
/* Сколько TB спать сейчас (0 = активный интервал или standby выключен). */
|
||
int standby_get_sleep_tb(void);
|
||
|
||
/* Сколько TB осталось активного режима (0 = спим или standby выключен). */
|
||
int standby_get_active_remaining_tb(void);
|
||
|
||
/* Ждёт до начала следующего активного интервала (как uasync timeout).
|
||
* При выходе из standby таймер отменяется и cb вызывается немедленно.
|
||
* Возвращает handle для standby_wait_cancel(). */
|
||
void* standby_wait(void* arg, void (*cb)(void* arg));
|
||
void standby_wait_cancel(void* handle);
|
||
|
||
/* Уведомление о внешней сетевой активности (Android ConnectivityManager).
|
||
* В фазе SLEEP после min_sleep пробуждает досрочно; иначе игнорируется.
|
||
* Вызывается на uasync-потоке. */
|
||
void standby_notify_network_activity(void);
|
||
|
||
/* Переопределить интервалы (мс), минуя chat_setting. Для тестов.
|
||
* active_ms/sleep_ms <= 0 → вернуться к chat_setting.
|
||
* min_sleep_ms может быть 0 (реагировать на сетевую активность сразу). */
|
||
void standby_set_intervals_ms(int active_ms, int sleep_ms, int min_sleep_ms);
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
#endif /* STANDBY_H */
|