gpui: Remove some unnecessay heap allocations in entity handling (#49579)

Release Notes:

- N/A *or* Added/Fixed/Improved ...
This commit is contained in:
Lukas Wirth authored and GitHub committed 2026-02-19 10:10:32 +00:00
1 parent 66cf6d247b
commit 9e9a0883b6
3 files changed
+14 -15

No files matched your search

+5 -3
View File
@@ -869,10 +869,12 @@ impl App {
&mut self,
callback: impl FnOnce(&mut App) -> R,
) -> (R, FxHashSet<EntityId>) {
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::<FxHashSet<EntityId>>();
+7 -9
View File
@@ -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<T>(&mut self, pointer: &Entity<T>) -> Lease<T> {
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<EntityId>) {
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<dyn Any>)> {
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!(
+2 -3
View File
@@ -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());
}