From 85cd0cc7db8308d0d17342800c53e8611fdbbb0a Mon Sep 17 00:00:00 2001 From: John Rogers Date: Thu, 10 Jul 2025 18:37:38 +0100 Subject: [PATCH] refactor: simplify PTP event handling to resolve borrow checker conflicts Co-authored-by: aider (openrouter/anthropic/claude-sonnet-4) --- src/ptp.rs | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/src/ptp.rs b/src/ptp.rs index 608254c..b87e987 100644 --- a/src/ptp.rs +++ b/src/ptp.rs @@ -163,35 +163,24 @@ async fn run_ptp_session( // Handle events and collect new actions tokio::select! { _ = tokio::time::sleep(Duration::from_millis(100)) => { - // Handle periodic timer events one at a time to avoid multiple mutable borrows - let sync_actions: Vec<_> = running_port.handle_sync_timer().collect(); - actions.extend(sync_actions); - - let announce_actions: Vec<_> = running_port.handle_announce_timer(&mut NoForwardedTLVs).collect(); - actions.extend(announce_actions); - - let delay_actions: Vec<_> = running_port.handle_delay_request_timer().collect(); - actions.extend(delay_actions); + // Handle timer events sequentially to avoid multiple mutable borrows + actions.extend(running_port.handle_sync_timer()); + actions.extend(running_port.handle_announce_timer(&mut NoForwardedTLVs)); + actions.extend(running_port.handle_delay_request_timer()); } Ok((len, _source_address)) = event_socket.recv_from(&mut event_buf) => { let receive_time = Time::from_nanos(std::time::SystemTime::now() .duration_since(std::time::UNIX_EPOCH) .unwrap() .as_nanos() as u64); - // Copy the data to avoid borrowing conflicts - let data = event_buf[..len].to_vec(); - let event_actions: Vec<_> = running_port.handle_event_receive(&data, receive_time).collect(); - actions.extend(event_actions); + actions.extend(running_port.handle_event_receive(&event_buf[..len], receive_time)); } Ok((len, _source_address)) = general_socket.recv_from(&mut general_buf) => { - // Copy the data to avoid borrowing conflicts - let data = general_buf[..len].to_vec(); - let general_actions: Vec<_> = running_port.handle_general_receive(&data).collect(); - actions.extend(general_actions); + actions.extend(running_port.handle_general_receive(&general_buf[..len])); } } - // Update shared state periodically + // Update shared state periodically (after all mutable operations are done) if last_state_update.elapsed() > Duration::from_millis(500) { let port_ds = running_port.port_ds(); let mut st = state.lock().unwrap();