diff --git a/src/core/registry.rs b/src/core/registry.rs index 50fe9f0..8bec421 100644 --- a/src/core/registry.rs +++ b/src/core/registry.rs @@ -1,8 +1,11 @@ -use parking_lot::Mutex; -use slab::Slab; +use std::ptr; use std::sync::{Arc, Weak}; -pub struct Registry(Mutex>>); +use core::hash::BuildHasherDefault; +use dashmap::DashMap; +use rustc_hash::FxHasher; + +pub struct Registry(DashMap, BuildHasherDefault>); impl Registry { pub fn add(&self, t: T) -> Arc { @@ -11,30 +14,22 @@ impl Registry { t_arc } pub fn add_raw(&self, t: &Arc) { - self.0.lock().insert(Arc::downgrade(t)); + self.0 + .insert(ptr::addr_of!(**t) as usize, Arc::downgrade(t)); } pub fn get_valid_contents(&self) -> Vec> { self.0 - .lock() .iter() - .filter_map(|(_, item)| item.upgrade()) + .filter_map(|pair| pair.value().upgrade()) .collect() } pub fn remove(&self, t: &T) { - for item in self.0.lock().iter() { - let (idx, item) = item; - if let Some(item) = item.upgrade() { - if std::ptr::eq(item.as_ref(), t) { - self.0.lock().remove(idx); - break; - } - } - } + self.0.remove(&(ptr::addr_of!(*t) as usize)); } } impl Default for Registry { fn default() -> Self { - Registry::(Mutex::new(Slab::new())) + Registry(DashMap::default()) } }