fix(registry): use dashmap and pointer keys
This commit is contained in:
@@ -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())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user