From 4da8f962d4abaf2f00da1e9d5153430ab8d4223c Mon Sep 17 00:00:00 2001 From: Nils Andreas Svee Date: Wed, 29 Apr 2026 01:14:32 +0700 Subject: [PATCH] feat(managed): automatically unregister dropped event subscriptions --- crates/irtt-client/src/managed/hub.rs | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/crates/irtt-client/src/managed/hub.rs b/crates/irtt-client/src/managed/hub.rs index 4e2b4f6..e3aabfa 100644 --- a/crates/irtt-client/src/managed/hub.rs +++ b/crates/irtt-client/src/managed/hub.rs @@ -2,7 +2,7 @@ use std::{ collections::{HashMap, VecDeque}, sync::{ atomic::{AtomicU64, Ordering}, - Arc, Condvar, Mutex, + Arc, Condvar, Mutex, Weak, }, }; @@ -43,6 +43,8 @@ struct HubInner { #[derive(Debug)] pub struct EventSubscription { + id: u64, + hub: Weak, inner: Arc, } @@ -94,7 +96,11 @@ impl EventHub { .expect("event hub mutex poisoned") .insert(id, inner.clone()); - Ok(EventSubscription { inner }) + Ok(EventSubscription { + id, + hub: Arc::downgrade(&self.inner), + inner, + }) } pub fn publish(&self, event: ClientEvent) { @@ -180,6 +186,18 @@ impl EventSubscription { } } +impl Drop for EventSubscription { + fn drop(&mut self) { + self.inner.disconnect(); + if let Some(hub) = self.hub.upgrade() { + hub.subscribers + .lock() + .expect("event hub mutex poisoned") + .remove(&self.id); + } + } +} + impl SubscriberInner { fn publish(&self, event: ClientEvent) -> bool { let mut state = self.state.lock().expect("subscriber mutex poisoned");