fix(registry): use dashmap and pointer keys

This commit is contained in:
Nova
2022-07-12 22:47:12 -04:00
parent 44ba9f2d68
commit ffcb955108

View File

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