mirror of
https://github.com/zed-industries/zed.git
synced 2026-06-01 03:14:56 +07:00
gpui: Remove some unnecessay heap allocations in entity handling (#49579)
Release Notes: - N/A *or* Added/Fixed/Improved ...
This commit is contained in:
parent
2786d36786
commit
fc79a6fbe7
3 changed files with 14 additions and 15 deletions
|
|
@ -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>>();
|
||||
|
|
|
|||
|
|
@ -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!(
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue