From a2208e8958f6cd9f39ca20dd8cf4d37d4c7a1775 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 6 Mar 2026 09:16:18 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E5=B0=86=20poll=5Fpoints=20=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=20Arc>=20=E4=BB=A5=E5=87=8F?= =?UTF-8?q?=E5=B0=91=20clone=20=E5=BC=80=E9=94=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/connection.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/connection.rs b/src/connection.rs index 44f8fef..60aa344 100644 --- a/src/connection.rs +++ b/src/connection.rs @@ -95,7 +95,7 @@ pub struct ConnectionStatus { pub next_client_handle: u32, pub client_handle_map: HashMap, // client_handle -> point_id pub monitored_item_map: HashMap, // point_id -> monitored_item_id - pub poll_points: Vec, // 正在轮询的点集合 + pub poll_points: Arc>, // 正在轮询的点集合 poll_handle: Option>, // 统一的轮询任务句柄 heartbeat_handle: Option>, // 心跳任务句柄 } @@ -370,7 +370,7 @@ impl ConnectionManager { let poll_points = { let status = status_ref.read().await; status.get(&source_id) - .map(|conn_status| conn_status.poll_points.clone()) + .map(|conn_status| Arc::clone(&conn_status.poll_points)) .unwrap_or_default() }; @@ -458,7 +458,7 @@ impl ConnectionManager { for point in points { // 检查点是否已经在轮询列表中 if !conn_status.poll_points.iter().any(|p| p.point_id == point.point_id) { - conn_status.poll_points.push(PollPointInfo { + Arc::make_mut(&mut conn_status.poll_points).push(PollPointInfo { point_id: point.point_id, external_id: point.external_id.clone(), }); @@ -592,7 +592,7 @@ impl ConnectionManager { next_client_handle: 1000, client_handle_map: HashMap::new(), monitored_item_map: HashMap::new(), - poll_points: Vec::new(), + poll_points: Arc::new(Vec::new()), poll_handle: None, heartbeat_handle: None, }, @@ -622,7 +622,7 @@ impl ConnectionManager { client_handle_map: HashMap::new(), monitored_item_map: HashMap::new(), next_client_handle: 1000, - poll_points: Vec::new(), + poll_points: Arc::new(Vec::new()), poll_handle: None, heartbeat_handle: None, }, @@ -653,7 +653,7 @@ impl ConnectionManager { { let mut status = self.status.write().await; if let Some(conn_status) = status.get_mut(&source_id) { - conn_status.poll_points.clear(); + Arc::make_mut(&mut conn_status.poll_points).clear(); if let Some(handle) = conn_status.poll_handle.take() { handle.abort(); } @@ -685,7 +685,7 @@ impl ConnectionManager { { let mut status = self.status.write().await; if let Some(conn_status) = status.get_mut(&source_id) { - conn_status.poll_points.clear(); + Arc::make_mut(&mut conn_status.poll_points).clear(); if let Some(handle) = conn_status.poll_handle.take() { handle.abort(); } @@ -1154,7 +1154,7 @@ impl ConnectionManager { .monitored_item_map .insert(point.point_id, monitored_item_result.result.monitored_item_id); // 从轮询列表中移除该点 - conn_status.poll_points.retain(|p| p.point_id != point.point_id); + Arc::make_mut(&mut conn_status.poll_points).retain(|p| p.point_id != point.point_id); } } else { tracing::error!( @@ -1302,7 +1302,7 @@ impl ConnectionManager { let mut status = self.status.write().await; if let Some(conn_status) = status.get_mut(&source_id) { let before_count = conn_status.poll_points.len(); - conn_status.poll_points.retain(|p| !target_ids.contains(&p.point_id)); + Arc::make_mut(&mut conn_status.poll_points).retain(|p| !target_ids.contains(&p.point_id)); let after_count = conn_status.poll_points.len(); before_count - after_count } else {