修复 JNI 建网后 TaskGroupGuard 被立即 drop 导致网络建完即死

TaskGroupGuard drop 会停止整个任务组且后续 spawn 静默失败。此前
nativeCreateNetwork 中 guard 在闭包结束即被释放:注册虽返回成功,
但数据处理任务根本不会启动,VPN 完全不通。

- GlobalState 增加 task_group_guards,guard 随实例持有
- nativeStop 中最后释放 guard;nativeDestroy 整体析构时随之释放
This commit is contained in:
lbl
2026-08-20 21:57:33 +08:00
parent 1ff7405681
commit bf2458d464
+9 -3
View File
@@ -14,7 +14,7 @@ use vnt_core::nat::NetInput;
use vnt_core::port_mapping::PortMapping;
use vnt_core::tls::verifier::CertValidationMode;
use vnt_core::tunnel_core::server::transport::config::ProtocolAddress;
use vnt_core::utils::task_control::TaskGroupManager;
use vnt_core::utils::task_control::{TaskGroupGuard, TaskGroupManager};
/// 全局状态管理
struct GlobalState {
@@ -26,6 +26,8 @@ struct GlobalState {
vnt_apis: HashMap<i64, VntApi>,
/// 任务组管理器
task_group_managers: HashMap<i64, TaskGroupManager>,
/// 任务组守卫(drop 时会停止任务组,必须持有到 nativeStop
task_group_guards: HashMap<i64, TaskGroupGuard>,
/// 下一个实例ID
next_id: i64,
}
@@ -37,6 +39,7 @@ impl GlobalState {
network_managers: HashMap::new(),
vnt_apis: HashMap::new(),
task_group_managers: HashMap::new(),
task_group_guards: HashMap::new(),
next_id: 1,
})
}
@@ -93,7 +96,7 @@ pub extern "system" fn Java_com_vnt_VntManager_nativeCreateNetwork<'local>(
// 创建任务组
let task_group_manager = TaskGroupManager::new();
let (task_group, _task_group_guard) = task_group_manager
let (task_group, task_group_guard) = task_group_manager
.create_task()
.context("create task group")?;
@@ -109,11 +112,12 @@ pub extern "system" fn Java_com_vnt_VntManager_nativeCreateNetwork<'local>(
let id = state.next_id;
state.next_id += 1;
// 保存实例
// 保存实例task_group_guard 必须随实例一直持有,drop 会停止整个任务组)
state
.network_managers
.insert(id, Arc::new(Mutex::new(Some(network_manager))));
state.task_group_managers.insert(id, task_group_manager);
state.task_group_guards.insert(id, task_group_guard);
Ok(id)
})();
@@ -397,6 +401,8 @@ pub extern "system" fn Java_com_vnt_VntNetwork_nativeStop(
state.network_managers.remove(&handle);
state.vnt_apis.remove(&handle);
state.task_group_managers.remove(&handle);
// 最后释放守卫(drop 时会停止任务组)
state.task_group_guards.remove(&handle);
Ok(())
})();