From fc79a6fbe7f5d73b5b5355152033e8ae957805f7 Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Thu, 19 Feb 2026 11:10:32 +0100 Subject: [PATCH] gpui: Remove some unnecessay heap allocations in entity handling (#49579) Release Notes: - N/A *or* Added/Fixed/Improved ... --- crates/gpui/src/app.rs | 8 +++++--- crates/gpui/src/app/entity_map.rs | 16 +++++++--------- crates/gpui/src/window.rs | 5 ++--- 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/crates/gpui/src/app.rs b/crates/gpui/src/app.rs index 5313cf66ab2128b937fc0109787b214577637017..8f5c082a05de90be9575798daef4c8ea6f17b0b3 100644 --- a/crates/gpui/src/app.rs +++ b/crates/gpui/src/app.rs @@ -869,10 +869,12 @@ impl App { &mut self, callback: impl FnOnce(&mut App) -> R, ) -> (R, FxHashSet) { - let accessed_entities_start = self.entities.accessed_entities.borrow().clone(); + let accessed_entities_start = self.entities.accessed_entities.get_mut().clone(); let result = callback(self); - let accessed_entities_end = self.entities.accessed_entities.borrow().clone(); - let entities_accessed_in_callback = accessed_entities_end + let entities_accessed_in_callback = self + .entities + .accessed_entities + .get_mut() .difference(&accessed_entities_start) .copied() .collect::>(); diff --git a/crates/gpui/src/app/entity_map.rs b/crates/gpui/src/app/entity_map.rs index 6cf18a69177286048860d3c711b19eda038874b7..2df01a1b6e05434f0b9a6822f12b0038efc5c10a 100644 --- a/crates/gpui/src/app/entity_map.rs +++ b/crates/gpui/src/app/entity_map.rs @@ -11,7 +11,6 @@ use std::{ fmt::{self, Display}, hash::{Hash, Hasher}, marker::PhantomData, - mem, num::NonZeroU64, sync::{ Arc, Weak, @@ -95,7 +94,7 @@ impl EntityMap { where T: 'static, { - let mut accessed_entities = self.accessed_entities.borrow_mut(); + let mut accessed_entities = self.accessed_entities.get_mut(); accessed_entities.insert(slot.entity_id); let handle = slot.0; @@ -107,7 +106,7 @@ impl EntityMap { #[track_caller] pub fn lease(&mut self, pointer: &Entity) -> Lease { self.assert_valid_context(pointer); - let mut accessed_entities = self.accessed_entities.borrow_mut(); + let mut accessed_entities = self.accessed_entities.get_mut(); accessed_entities.insert(pointer.entity_id); let entity = Some( @@ -147,21 +146,20 @@ impl EntityMap { pub fn extend_accessed(&mut self, entities: &FxHashSet) { self.accessed_entities - .borrow_mut() + .get_mut() .extend(entities.iter().copied()); } pub fn clear_accessed(&mut self) { - self.accessed_entities.borrow_mut().clear(); + self.accessed_entities.get_mut().clear(); } pub fn take_dropped(&mut self) -> Vec<(EntityId, Box)> { - let mut ref_counts = self.ref_counts.write(); - let dropped_entity_ids = mem::take(&mut ref_counts.dropped_entity_ids); - let mut accessed_entities = self.accessed_entities.borrow_mut(); + let mut ref_counts = &mut *self.ref_counts.write(); + let dropped_entity_ids = ref_counts.dropped_entity_ids.drain(..); + let mut accessed_entities = self.accessed_entities.get_mut(); dropped_entity_ids - .into_iter() .filter_map(|entity_id| { let count = ref_counts.counts.remove(entity_id).unwrap(); debug_assert_eq!( diff --git a/crates/gpui/src/window.rs b/crates/gpui/src/window.rs index 8be96c418f49262db6a57b6ca5ad0f30424d36c9..206ab7b6cb7532bbf74ba4fa56c140786d815ee9 100644 --- a/crates/gpui/src/window.rs +++ b/crates/gpui/src/window.rs @@ -2236,9 +2236,8 @@ impl Window { } fn record_entities_accessed(&mut self, cx: &mut App) { - let mut entities_ref = cx.entities.accessed_entities.borrow_mut(); + let mut entities_ref = cx.entities.accessed_entities.get_mut(); let mut entities = mem::take(entities_ref.deref_mut()); - drop(entities_ref); let handle = self.handle; cx.record_entities_accessed( handle, @@ -2246,7 +2245,7 @@ impl Window { self.invalidator.clone(), &entities, ); - let mut entities_ref = cx.entities.accessed_entities.borrow_mut(); + let mut entities_ref = cx.entities.accessed_entities.get_mut(); mem::swap(&mut entities, entities_ref.deref_mut()); }