Preserve bridge callbacks until native worker shutdown succeeds

This commit is contained in:
evgeny committed 2026-10-27 18:57:36 +01:00
1 parent d83d58c874
commit d6ea893f16
3 files changed
+9 -7

No files matched your search

+2 -2
View File
@@ -77,11 +77,11 @@ static int check_bridge_config(void) {
REQUIRE(utun_bridge_init(NULL, 0, NULL, NULL, &config));
REQUIRE(cfg_get_int(CFG_KEY_CONTROL_PORT, -1) == 4321);
REQUIRE(cfg_get_string(CFG_KEY_NODE_NAME, NULL) == NULL && cfg_get_int64("wide", 789) == 789);
utun_bridge_destroy();
REQUIRE(!utun_bridge_destroy());
REQUIRE(cfg_get_int(CFG_KEY_CONTROL_PORT, 9999) == 9999);
REQUIRE(utun_bridge_init(NULL, 0, NULL, NULL, NULL));
REQUIRE(cfg_get_int(CFG_KEY_CONTROL_PORT, 9998) == 9998);
utun_bridge_destroy();
REQUIRE(!utun_bridge_destroy());
printf("[PASS] bridge config: init, replacement, destroy and reinit\n");
return 0;
}
@@ -166,15 +166,16 @@ bool utun_bridge_init(const char* db_path, int control_port,
return true;
}
void utun_bridge_destroy(void) {
int utun_bridge_destroy(void) {
if (instance_lite_stop()) { bridge_log(BLEV_ERROR, "bridge destroy refused: worker is not joined"); return -1; }
voice_recorder_deinit();
instance_lite_stop();
utun_config_set_provider(NULL);
g_on_log = NULL;
g_cfg_string = NULL;
g_cfg_int64 = NULL;
g_cfg_int = NULL;
bridge_log(BLEV_INFO, "bridge destroy");
return 0;
}
/* Удалять только после остановки ядра: отсутствие файла нормально, остальные ошибки не скрывать. */
@@ -59,11 +59,12 @@ int utun_bridge_start(const char* config_text);
* При частичном отказе проверяет остальные файлы; каждую ошибку и итоговые счётчики пишет в лог. */
int utun_bridge_clear_database(const char* db_path);
/* Освободить recorder, вызвать instance_lite_stop и снять C log/config callbacks.
/* Полностью остановить/join worker, освободить recorder и снять C log/config callbacks.
* Config-provider сбрасывается к defaults; повторный init начинает новую регистрацию.
* Перед вызовом остановить внешние media workers/DSP; ограничения ожидания — instance_lite.h.
* Перед вызовом остановить внешние media workers/DSP, ждать вне UI; контракт ожидания — instance_lite.h.
* 0 — очистка завершена; -1 — stop/join отклонён, recorder и callbacks сохранены, новый init запрещён.
* JNI nativeStop дополнительно останавливает UDP-лог, nativeDestroy освобождает JNI global refs. */
void utun_bridge_destroy(void);
int utun_bridge_destroy(void);
/* ── Actions (Kotlin → C) ── */