修复 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::port_mapping::PortMapping;
|
||||||
use vnt_core::tls::verifier::CertValidationMode;
|
use vnt_core::tls::verifier::CertValidationMode;
|
||||||
use vnt_core::tunnel_core::server::transport::config::ProtocolAddress;
|
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 {
|
struct GlobalState {
|
||||||
@@ -26,6 +26,8 @@ struct GlobalState {
|
|||||||
vnt_apis: HashMap<i64, VntApi>,
|
vnt_apis: HashMap<i64, VntApi>,
|
||||||
/// 任务组管理器
|
/// 任务组管理器
|
||||||
task_group_managers: HashMap<i64, TaskGroupManager>,
|
task_group_managers: HashMap<i64, TaskGroupManager>,
|
||||||
|
/// 任务组守卫(drop 时会停止任务组,必须持有到 nativeStop)
|
||||||
|
task_group_guards: HashMap<i64, TaskGroupGuard>,
|
||||||
/// 下一个实例ID
|
/// 下一个实例ID
|
||||||
next_id: i64,
|
next_id: i64,
|
||||||
}
|
}
|
||||||
@@ -37,6 +39,7 @@ impl GlobalState {
|
|||||||
network_managers: HashMap::new(),
|
network_managers: HashMap::new(),
|
||||||
vnt_apis: HashMap::new(),
|
vnt_apis: HashMap::new(),
|
||||||
task_group_managers: HashMap::new(),
|
task_group_managers: HashMap::new(),
|
||||||
|
task_group_guards: HashMap::new(),
|
||||||
next_id: 1,
|
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_manager = TaskGroupManager::new();
|
||||||
let (task_group, _task_group_guard) = task_group_manager
|
let (task_group, task_group_guard) = task_group_manager
|
||||||
.create_task()
|
.create_task()
|
||||||
.context("create task group")?;
|
.context("create task group")?;
|
||||||
|
|
||||||
@@ -109,11 +112,12 @@ pub extern "system" fn Java_com_vnt_VntManager_nativeCreateNetwork<'local>(
|
|||||||
let id = state.next_id;
|
let id = state.next_id;
|
||||||
state.next_id += 1;
|
state.next_id += 1;
|
||||||
|
|
||||||
// 保存实例
|
// 保存实例(task_group_guard 必须随实例一直持有,drop 会停止整个任务组)
|
||||||
state
|
state
|
||||||
.network_managers
|
.network_managers
|
||||||
.insert(id, Arc::new(Mutex::new(Some(network_manager))));
|
.insert(id, Arc::new(Mutex::new(Some(network_manager))));
|
||||||
state.task_group_managers.insert(id, task_group_manager);
|
state.task_group_managers.insert(id, task_group_manager);
|
||||||
|
state.task_group_guards.insert(id, task_group_guard);
|
||||||
|
|
||||||
Ok(id)
|
Ok(id)
|
||||||
})();
|
})();
|
||||||
@@ -397,6 +401,8 @@ pub extern "system" fn Java_com_vnt_VntNetwork_nativeStop(
|
|||||||
state.network_managers.remove(&handle);
|
state.network_managers.remove(&handle);
|
||||||
state.vnt_apis.remove(&handle);
|
state.vnt_apis.remove(&handle);
|
||||||
state.task_group_managers.remove(&handle);
|
state.task_group_managers.remove(&handle);
|
||||||
|
// 最后释放守卫(drop 时会停止任务组)
|
||||||
|
state.task_group_guards.remove(&handle);
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
})();
|
})();
|
||||||
|
|||||||
Reference in New Issue
Block a user