feat: save event_loop handle to avoid ghost session
This commit is contained in:
parent
b197607d5f
commit
76b6e17927
|
|
@ -98,6 +98,7 @@ pub struct ConnectionStatus {
|
|||
pub poll_points: Arc<Vec<PollPointInfo>>, // 正在轮询的点集合
|
||||
poll_handle: Option<JoinHandle<()>>, // 统一的轮询任务句柄
|
||||
heartbeat_handle: Option<JoinHandle<()>>, // 心跳任务句柄
|
||||
event_loop_handle: Option<JoinHandle<opcua::types::StatusCode>>, // event_loop 任务句柄
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
|
|
@ -577,8 +578,13 @@ impl ConnectionManager {
|
|||
}
|
||||
};
|
||||
|
||||
let _ = event_loop.spawn();
|
||||
session.wait_for_connection().await;
|
||||
let event_loop_handle = event_loop.spawn();
|
||||
|
||||
if !session.wait_for_connection().await {
|
||||
let error = "Session connection failed".to_string();
|
||||
self.fail_connect(source_id, &error).await;
|
||||
return Err(error);
|
||||
}
|
||||
|
||||
let mut status = self.status.write().await;
|
||||
status.insert(
|
||||
|
|
@ -595,6 +601,7 @@ impl ConnectionManager {
|
|||
poll_points: Arc::new(Vec::new()),
|
||||
poll_handle: None,
|
||||
heartbeat_handle: None,
|
||||
event_loop_handle: Some(event_loop_handle),
|
||||
},
|
||||
);
|
||||
drop(status); // 显式释放锁,在调用 start_unified_poll_task 之前
|
||||
|
|
@ -625,6 +632,7 @@ impl ConnectionManager {
|
|||
poll_points: Arc::new(Vec::new()),
|
||||
poll_handle: None,
|
||||
heartbeat_handle: None,
|
||||
event_loop_handle: None,
|
||||
},
|
||||
);
|
||||
}
|
||||
|
|
@ -661,6 +669,10 @@ impl ConnectionManager {
|
|||
if let Some(handle) = conn_status.heartbeat_handle.take() {
|
||||
handle.abort();
|
||||
}
|
||||
// 停止 event_loop 任务
|
||||
if let Some(handle) = conn_status.event_loop_handle.take() {
|
||||
handle.abort();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -693,6 +705,10 @@ impl ConnectionManager {
|
|||
if let Some(handle) = conn_status.heartbeat_handle.take() {
|
||||
handle.abort();
|
||||
}
|
||||
// 停止 event_loop 任务
|
||||
if let Some(handle) = conn_status.event_loop_handle.take() {
|
||||
handle.abort();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue