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 2026-02-19 11:10:32 +01:00 committed by GitHub
parent 2786d36786
commit fc79a6fbe7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 14 additions and 15 deletions

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>>();

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!(

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());
}