diff --git a/patch-db/src/locker.rs b/patch-db/src/locker.rs index d9cb44a..3f3fcf2 100644 --- a/patch-db/src/locker.rs +++ b/patch-db/src/locker.rs @@ -126,13 +126,13 @@ impl Trie { #[derive(Debug, Default)] struct Node { readers: Vec, - writers: HashSet, + writers: Vec, reqs: Vec, } impl Node { // true: If there are any writers, it is `id`. fn write_free(&self, id: u64) -> bool { - self.writers.is_empty() || (self.writers.len() == 1 && self.writers.contains(&id)) + self.writers.is_empty() || (self.writers.iter().filter(|a| a != &&id).count() == 0) } // true: If there are any readers, it is `id`. fn read_free(&self, id: u64) -> bool { @@ -158,7 +158,7 @@ impl Node { locks_on_lease: &mut Vec>, ) -> Option { if req.lock_info.write() && self.write_available(req.lock_info.handle_id) { - self.writers.insert(req.lock_info.handle_id); + self.writers.push(req.lock_info.handle_id); req.process(locks_on_lease) } else if !req.lock_info.write() && self.read_available(req.lock_info.handle_id) { self.readers.push(req.lock_info.handle_id); @@ -170,7 +170,15 @@ impl Node { } fn release(&mut self, mut lock_info: LockInfo) -> Option { if lock_info.write() { - self.writers.remove(&lock_info.handle_id); + if let Some(idx) = self + .writers + .iter() + .enumerate() + .find(|(_, id)| id == &&lock_info.handle_id) + .map(|(idx, _)| idx) + { + self.writers.swap_remove(idx); + } } else if let Some(idx) = self .readers .iter() @@ -178,7 +186,7 @@ impl Node { .find(|(_, id)| id == &&lock_info.handle_id) .map(|(idx, _)| idx) { - self.readers.swap_remove(idx); + assert!(lock_info.handle_id == self.readers.swap_remove(idx)); } if lock_info.ptr.len() == lock_info.segments_handled { None