修复 JNI 建网后 TaskGroupGuard 被立即 drop 导致网络建完即死
TaskGroupGuard drop 会停止整个任务组且后续 spawn 静默失败。此前 nativeCreateNetwork 中 guard 在闭包结束即被释放:注册虽返回成功, 但数据处理任务根本不会启动,VPN 完全不通。 - GlobalState 增加 task_group_guards,guard 随实例持有 - nativeStop 中最后释放 guard;nativeDestroy 整体析构时随之释放
This commit is contained in:
+9
-3
@@ -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(())
|
||||
})();
|
||||
|
||||
Reference in New Issue
Block a user