From 3f2cd77eb7dfe5985636ff7938fb2e95387fe635 Mon Sep 17 00:00:00 2001 From: Jen Tak Date: Tue, 6 Aug 2024 20:01:15 +0200 Subject: [PATCH] Try optimizing by acquiring RwLock fewer time --- src/lib.rs | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 726ee00..a09e60a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -736,16 +736,27 @@ impl SystemHandle { &self, recipient: Recipient, ) -> Result<(), SendError> { + let mut event_subscribers = self.event_subscribers.write(); + // Send the last cached value (if there is one) - if let Some(last_cached_value) = - self.event_subscribers.read().last_value_cache.get(&TypeId::of::()) + if let Some(last_cached_value) = event_subscribers.last_value_cache.get(&TypeId::of::()) { if let Some(msg) = last_cached_value.downcast_ref::() { recipient.send(msg.clone().into())?; } } - self.subscribe_recipient::(recipient); + // Duplicate the contents of Self::subscribe_recipient() to reuse the same WriteGuard + // for better performance. + let subs = event_subscribers.events.entry(TypeId::of::()).or_default(); + subs.push(Box::new(move |e| { + if let Some(event) = e.downcast_ref::() { + let msg = event.clone(); + recipient.send(msg.into())?; + } + + Ok(()) + })); Ok(()) } @@ -1325,9 +1336,9 @@ mod tests { struct Subscriber; impl Actor for Subscriber { - type Message = (); type Context = Context; type Error = (); + type Message = (); fn started(&mut self, context: &mut Self::Context) { context