diff --git a/src/event.rs b/src/event.rs index 3b3e475db2..7398145ad6 100644 --- a/src/event.rs +++ b/src/event.rs @@ -2,7 +2,6 @@ use alloc::sync::Arc; use core::sync::atomic::{AtomicUsize, Ordering}; use hashbrown::{hash_map::DefaultHashBuilder, HashMap}; use smallvec::SmallVec; -use spin::Once; use syscall::data::GlobalSchemes; use crate::{ @@ -131,22 +130,8 @@ pub struct QueueKey { type Registry = HashMap>; -static REGISTRY: Once> = Once::new(); - -/// Initialize registry, called if needed -fn init_registry() -> RwLock { - RwLock::new(Registry::new()) -} - -/// Get the global schemes list, const -fn registry<'a>(token: &'a mut LockToken<'a, L1>) -> RwLockReadGuard<'a, L2, Registry> { - REGISTRY.call_once(init_registry).read(token.token()) -} - -/// Get the global schemes list, mutable -pub fn registry_mut<'a>(token: &'a mut LockToken<'a, L1>) -> RwLockWriteGuard<'a, L2, Registry> { - REGISTRY.call_once(init_registry).write(token.token()) -} +static REGISTRY: RwLock = + RwLock::new(HashMap::with_hasher(DefaultHashBuilder::new())); pub fn register( reg_key: RegKey, @@ -154,8 +139,7 @@ pub fn register( flags: EventFlags, token: &mut CleanLockToken, ) { - let mut token = token.downgrade(); - let mut registry = registry_mut(&mut token); + let mut registry = REGISTRY.write(token.token()); let entry = registry.entry(reg_key).or_default(); @@ -170,9 +154,7 @@ pub fn sync(reg_key: RegKey, token: &mut CleanLockToken) -> Result { let mut flags = EventFlags::empty(); { - let mut token = token.downgrade(); - let registry = registry(&mut token); - + let registry = REGISTRY.read(token.token()); if let Some(queue_list) = registry.get(®_key) { for (_queue_key, &queue_flags) in queue_list.iter() { flags |= queue_flags; @@ -186,9 +168,7 @@ pub fn sync(reg_key: RegKey, token: &mut CleanLockToken) -> Result { } pub fn unregister_file(scheme: SchemeId, number: usize, token: &mut CleanLockToken) { - let mut token = token.downgrade(); - let mut registry = registry_mut(&mut token); - + let mut registry = REGISTRY.write(token.token()); registry.remove(&RegKey { scheme, number }); } @@ -212,8 +192,7 @@ fn trigger_inner( let mut full = false; { - let mut token = token.token(); - let registry = registry(&mut token); + let registry = REGISTRY.read(token.token()); if let Some(queue_list) = registry.get(&RegKey { scheme, number }) { for (queue_key, &queue_flags) in queue_list.iter().skip(*offset) { let common_flags = flags & queue_flags;