From 2cc2dffab56e3784d7b9b292ae5855f12371cd58 Mon Sep 17 00:00:00 2001 From: Joe Thornber Date: Thu, 20 Aug 2020 11:05:14 +0100 Subject: [PATCH] [thin_check (rust)] Make NodeVisitor::visit non mut. Preparation for making btree_walk multithreaded --- src/pdata/btree.rs | 18 +++++++++--------- src/thin/check.rs | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/pdata/btree.rs b/src/pdata/btree.rs index 38adeae..a928927 100644 --- a/src/pdata/btree.rs +++ b/src/pdata/btree.rs @@ -147,7 +147,8 @@ pub fn unpack_node( //------------------------------------------ pub trait NodeVisitor { - fn visit(&mut self, header: &NodeHeader, keys: &[u64], values: &[V]) -> Result<()>; + // &self is deliberately non mut to allow the walker to use multiple threads. + fn visit(&self, header: &NodeHeader, keys: &[u64], values: &[V]) -> Result<()>; } #[derive(Clone)] @@ -274,23 +275,22 @@ impl BTreeWalker { //------------------------------------------ struct ValueCollector { - values: BTreeMap, + values: Mutex>, } impl ValueCollector { fn new() -> ValueCollector { ValueCollector { - values: BTreeMap::new(), + values: Mutex::new(BTreeMap::new()), } } } impl NodeVisitor for ValueCollector { - fn visit(&mut self, _h: &NodeHeader, keys: &[u64], values: &[V]) -> Result<()> { + fn visit(&self, _h: &NodeHeader, keys: &[u64], values: &[V]) -> Result<()> { + let mut vals = self.values.lock().unwrap(); for n in 0..keys.len() { - let k = keys[n]; - let v = values[n].clone(); - self.values.insert(k, v); + vals.insert(keys[n], values[n].clone()); } Ok(()) @@ -306,7 +306,7 @@ pub fn btree_to_map( let mut visitor = ValueCollector::::new(); walker.walk(&mut visitor, root)?; - Ok(visitor.values) + Ok(visitor.values.into_inner().unwrap()) } pub fn btree_to_map_with_sm( @@ -319,7 +319,7 @@ pub fn btree_to_map_with_sm( let mut visitor = ValueCollector::::new(); walker.walk(&mut visitor, root)?; - Ok(visitor.values) + Ok(visitor.values.into_inner().unwrap()) } //------------------------------------------ diff --git a/src/thin/check.rs b/src/thin/check.rs index 9fcd33f..c38fddc 100644 --- a/src/thin/check.rs +++ b/src/thin/check.rs @@ -50,7 +50,7 @@ struct BottomLevelVisitor { //------------------------------------------ impl NodeVisitor for BottomLevelVisitor { - fn visit(&mut self, _h: &NodeHeader, _k: &[u64], values: &[BlockTime]) -> Result<()> { + fn visit(&self, _h: &NodeHeader, _k: &[u64], values: &[BlockTime]) -> Result<()> { // FIXME: do other checks if values.len() == 0 { @@ -124,7 +124,7 @@ impl<'a> OverflowChecker<'a> { } impl<'a> NodeVisitor for OverflowChecker<'a> { - fn visit(&mut self, _h: &NodeHeader, keys: &[u64], values: &[u32]) -> Result<()> { + fn visit(&self, _h: &NodeHeader, keys: &[u64], values: &[u32]) -> Result<()> { for n in 0..keys.len() { let k = keys[n]; let v = values[n];