fix minor bugs

This commit is contained in:
Aiden McClelland
2021-09-23 21:18:04 -06:00
committed by Aiden McClelland
parent a861f8173f
commit 226acc0f8d

View File

@@ -14,8 +14,12 @@ impl LockInfo {
fn write(&self) -> bool { fn write(&self) -> bool {
self.write && self.segments_handled == self.ptr.len() self.write && self.segments_handled == self.ptr.len()
} }
fn next_seg(&self) -> Option<&str> { fn current_seg(&self) -> Option<&str> {
self.ptr.get_segment(self.segments_handled) if self.segments_handled == 0 {
Some("") // root
} else {
self.ptr.get_segment(self.segments_handled - 1)
}
} }
} }
@@ -57,7 +61,7 @@ impl Drop for Guard {
} }
} }
#[derive(Default)] #[derive(Debug, Default)]
struct Node { struct Node {
readers: Vec<usize>, readers: Vec<usize>,
writers: HashSet<usize>, writers: HashSet<usize>,
@@ -140,7 +144,7 @@ impl Node {
} }
} }
#[derive(Default)] #[derive(Debug, Default)]
struct Trie { struct Trie {
node: Node, node: Node,
children: HashMap<String, Trie>, children: HashMap<String, Trie>,
@@ -158,7 +162,7 @@ impl Trie {
returned_locks: &mut Vec<oneshot::Receiver<LockInfo>>, returned_locks: &mut Vec<oneshot::Receiver<LockInfo>>,
) { ) {
if let Some(req) = self.node.handle_request(req, returned_locks) { if let Some(req) = self.node.handle_request(req, returned_locks) {
if let Some(seg) = req.lock_info.next_seg() { if let Some(seg) = req.lock_info.current_seg() {
self.child_mut(seg).handle_request(req, returned_locks) self.child_mut(seg).handle_request(req, returned_locks)
} }
} }
@@ -173,7 +177,7 @@ impl Trie {
self.handle_request(req, returned_locks); self.handle_request(req, returned_locks);
} }
if let Some(release) = release { if let Some(release) = release {
if let Some(seg) = release.next_seg() { if let Some(seg) = release.current_seg() {
self.child_mut(seg).handle_release(release, returned_locks) self.child_mut(seg).handle_release(release, returned_locks)
} }
} }
@@ -192,14 +196,19 @@ impl Locker {
closed: false, closed: false,
recv: receiver, recv: receiver,
}; };
let mut returned_locks = Vec::new(); let (_non_empty_send, non_empty_recv) = oneshot::channel();
let mut returned_locks = vec![non_empty_recv];
while let Some(action) = get_action(&mut new_requests, &mut returned_locks).await { while let Some(action) = get_action(&mut new_requests, &mut returned_locks).await {
#[cfg(feature = "log")]
log::trace!("Locker Action: {:#?}", action);
match action { match action {
Action::HandleRequest(req) => trie.handle_request(req, &mut returned_locks), Action::HandleRequest(req) => trie.handle_request(req, &mut returned_locks),
Action::HandleRelease(lock_info) => { Action::HandleRelease(lock_info) => {
trie.handle_release(lock_info, &mut returned_locks) trie.handle_release(lock_info, &mut returned_locks)
} }
} }
#[cfg(feature = "log")]
log::trace!("Locker Trie: {:#?}", trie);
} }
}); });
Locker { sender } Locker { sender }