From f9a104d2b0a0d45242ad69010569faf9f04304cb Mon Sep 17 00:00:00 2001 From: yuyaprgrm Date: Wed, 8 Apr 2026 19:40:31 +0900 Subject: [PATCH] refactor: optimize RoomLease lifecycle for better performance - introduce `SessionEvent::PreUpdate` to clear broadcast buffer before updates - this ensures Arc reference count is 1 for efficient CoW in `Arc::make_mut` --- src/reporting/reporter.rs | 1 + src/room/session.rs | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/src/reporting/reporter.rs b/src/reporting/reporter.rs index 90f53f3..ecac47e 100644 --- a/src/reporting/reporter.rs +++ b/src/reporting/reporter.rs @@ -329,6 +329,7 @@ impl Reporter { } break; } + Ok(SessionEvent::PreUpdate) => {} Err(broadcast::error::RecvError::Lagged(skipped)) => { warn!( "Reporter lagged behind, skipped {} events. Catching up.", diff --git a/src/room/session.rs b/src/room/session.rs index 2e70840..dd59310 100644 --- a/src/room/session.rs +++ b/src/room/session.rs @@ -120,6 +120,12 @@ pub struct VoiceStateUpdate { /// Events emitted by a session to its subscribers (e.g., for reporting). #[derive(Clone)] pub enum SessionEvent { + /// The session will update the internal state. + /// + /// ## Note + /// since channel capacity is supposed to be 1, this will explicitly release + /// a room lease contained in [`Updated`](SessionEvent::Updated) + PreUpdate, /// The session's internal state (room model) has been updated. Updated { room: RoomLease }, /// The session has finished and is now closed. @@ -174,6 +180,7 @@ impl Session { SessionMessage::VoiceStateUpdate(voice_state_update) => { let Some(flags) = voice_state_update.flags else { info!(user_id = %voice_state_update.user_id, "Participant disconnected"); + let _ = self.event_tx.send(SessionEvent::PreUpdate); let status = match self.room.handle_disconnect( voice_state_update.now, voice_state_update.user_id, @@ -200,6 +207,7 @@ impl Session { if self.room.is_connected(voice_state_update.user_id) { info!(user_id = %voice_state_update.user_id, flags = ?voice_state_update.flags, "Participant state updated"); + let _ = self.event_tx.send(SessionEvent::PreUpdate); self.room .handle_update( voice_state_update.now, @@ -212,6 +220,7 @@ impl Session { }); } else { info!(user_id = %voice_state_update.user_id, "Participant connected"); + let _ = self.event_tx.send(SessionEvent::PreUpdate); self.room .handle_connect( voice_state_update.now,