Improving self-documentation of the implementation of Registry. (#732)
This commit is contained in:
parent
fde4038ede
commit
a73d7e941f
|
@ -8,7 +8,19 @@ use syscall::data::Event;
|
||||||
|
|
||||||
type EventList = Weak<WaitQueue<Event>>;
|
type EventList = Weak<WaitQueue<Event>>;
|
||||||
|
|
||||||
type Registry = BTreeMap<(usize, usize), BTreeMap<(usize, usize), EventList>>;
|
#[derive(PartialEq, Eq, PartialOrd, Ord)]
|
||||||
|
pub struct RegKey {
|
||||||
|
scheme_id: usize,
|
||||||
|
event_id: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(PartialEq, Eq, PartialOrd, Ord)]
|
||||||
|
pub struct ProcessKey {
|
||||||
|
context_id: usize,
|
||||||
|
fd: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
type Registry = BTreeMap<RegKey, BTreeMap<ProcessKey, EventList>>;
|
||||||
|
|
||||||
static REGISTRY: Once<RwLock<Registry>> = Once::new();
|
static REGISTRY: Once<RwLock<Registry>> = Once::new();
|
||||||
|
|
||||||
|
@ -36,13 +48,20 @@ pub fn register(fd: usize, scheme_id: usize, event_id: usize) -> bool {
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut registry = registry_mut();
|
let mut registry = registry_mut();
|
||||||
let entry = registry.entry((scheme_id, event_id)).or_insert_with(|| {
|
let entry = registry.entry(RegKey {
|
||||||
|
scheme_id: scheme_id,
|
||||||
|
event_id: event_id
|
||||||
|
}).or_insert_with(|| {
|
||||||
BTreeMap::new()
|
BTreeMap::new()
|
||||||
});
|
});
|
||||||
if entry.contains_key(&(context_id, fd)) {
|
let process_key = ProcessKey {
|
||||||
|
context_id: context_id,
|
||||||
|
fd: fd
|
||||||
|
};
|
||||||
|
if entry.contains_key(&process_key) {
|
||||||
false
|
false
|
||||||
} else {
|
} else {
|
||||||
entry.insert((context_id, fd), events);
|
entry.insert(process_key, events);
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -51,8 +70,16 @@ pub fn unregister(fd: usize, scheme_id: usize, event_id: usize) {
|
||||||
let mut registry = registry_mut();
|
let mut registry = registry_mut();
|
||||||
|
|
||||||
let mut remove = false;
|
let mut remove = false;
|
||||||
if let Some(entry) = registry.get_mut(&(scheme_id, event_id)) {
|
let key = RegKey {
|
||||||
entry.remove(&(context::context_id(), fd));
|
scheme_id: scheme_id,
|
||||||
|
event_id: event_id
|
||||||
|
};
|
||||||
|
if let Some(entry) = registry.get_mut(&key) {
|
||||||
|
let process_key = ProcessKey {
|
||||||
|
context_id: context::context_id(),
|
||||||
|
fd: fd,
|
||||||
|
};
|
||||||
|
entry.remove(&process_key);
|
||||||
|
|
||||||
if entry.is_empty() {
|
if entry.is_empty() {
|
||||||
remove = true;
|
remove = true;
|
||||||
|
@ -60,17 +87,21 @@ pub fn unregister(fd: usize, scheme_id: usize, event_id: usize) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if remove {
|
if remove {
|
||||||
registry.remove(&(scheme_id, event_id));
|
registry.remove(&key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn trigger(scheme_id: usize, event_id: usize, flags: usize, data: usize) {
|
pub fn trigger(scheme_id: usize, event_id: usize, flags: usize, data: usize) {
|
||||||
let registry = registry();
|
let registry = registry();
|
||||||
if let Some(event_lists) = registry.get(&(scheme_id, event_id)) {
|
let key = RegKey {
|
||||||
|
scheme_id: scheme_id,
|
||||||
|
event_id: event_id
|
||||||
|
};
|
||||||
|
if let Some(event_lists) = registry.get(&key) {
|
||||||
for entry in event_lists.iter() {
|
for entry in event_lists.iter() {
|
||||||
if let Some(event_list) = entry.1.upgrade() {
|
if let Some(event_list) = entry.1.upgrade() {
|
||||||
event_list.send(Event {
|
event_list.send(Event {
|
||||||
id: (entry.0).1,
|
id: (entry.0).context_id,
|
||||||
flags: flags,
|
flags: flags,
|
||||||
data: data
|
data: data
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in a new issue