diff --git a/bucket_map/src/bucket.rs b/bucket_map/src/bucket.rs index 0fbd5d9d97..5a91bcf8f4 100644 --- a/bucket_map/src/bucket.rs +++ b/bucket_map/src/bucket.rs @@ -1,7 +1,7 @@ use crate::bucket_item::BucketItem; use crate::bucket_map::BucketMapError; use crate::bucket_stats::BucketMapStats; -use crate::bucket_storage::BucketStorage; +use crate::bucket_storage::{BucketStorage, UID_UNLOCKED}; use crate::index_entry::IndexEntry; use crate::{MaxSearch, RefCount}; use rand::thread_rng; @@ -59,7 +59,7 @@ impl Bucket { pub fn keys(&self) -> Vec { let mut rv = vec![]; for i in 0..self.index.num_cells() { - if self.index.uid(i) == 0 { + if self.index.uid(i) == UID_UNLOCKED { continue; } let ix: &IndexEntry = self.index.get(i); @@ -75,7 +75,7 @@ impl Bucket { let mut result = Vec::with_capacity(self.index.used.load(Ordering::Relaxed) as usize); for i in 0..self.index.num_cells() { let ii = i % self.index.num_cells(); - if self.index.uid(ii) == 0 { + if self.index.uid(ii) == UID_UNLOCKED { continue; } let ix: &IndexEntry = self.index.get(ii); @@ -108,7 +108,7 @@ impl Bucket { let ix = Self::bucket_index_ix(index, key, random); for i in ix..ix + index.max_search() { let ii = i % index.num_cells(); - if index.uid(ii) == 0 { + if index.uid(ii) == UID_UNLOCKED { continue; } let elem: &mut IndexEntry = index.get_mut(ii); @@ -127,7 +127,7 @@ impl Bucket { let ix = Self::bucket_index_ix(index, key, random); for i in ix..ix + index.max_search() { let ii = i % index.num_cells(); - if index.uid(ii) == 0 { + if index.uid(ii) == UID_UNLOCKED { continue; } let elem: &IndexEntry = index.get(ii); @@ -148,7 +148,7 @@ impl Bucket { let ix = Self::bucket_index_ix(index, key, random); for i in ix..ix + index.max_search() { let ii = i as u64 % index.num_cells(); - if index.uid(ii) != 0 { + if index.uid(ii) != UID_UNLOCKED { continue; } index.allocate(ii, elem_uid).unwrap(); @@ -237,7 +237,7 @@ impl Bucket { let pos = thread_rng().gen_range(0, cap); for i in pos..pos + self.index.max_search() { let ix = i % cap; - if best_bucket.uid(ix) == 0 { + if best_bucket.uid(ix) == UID_UNLOCKED { let elem_loc = elem.data_loc(current_bucket); if elem.num_slots > 0 { current_bucket.free(elem_loc, elem_uid); @@ -294,7 +294,7 @@ impl Bucket { let mut valid = true; for ix in 0..self.index.num_cells() { let uid = self.index.uid(ix); - if 0 != uid { + if UID_UNLOCKED != uid { let elem: &IndexEntry = self.index.get(ix); let ref_count = 0; // ??? TODO let new_ix = diff --git a/bucket_map/src/bucket_storage.rs b/bucket_map/src/bucket_storage.rs index fb8317ad27..f98f168873 100644 --- a/bucket_map/src/bucket_storage.rs +++ b/bucket_map/src/bucket_storage.rs @@ -36,15 +36,18 @@ struct Header { lock: AtomicU64, } +/// A Header UID of 0 indicates that the header is unlocked +pub(crate) const UID_UNLOCKED: u64 = 0; + impl Header { fn try_lock(&self, uid: u64) -> bool { - Ok(0) + Ok(UID_UNLOCKED) == self .lock - .compare_exchange(0, uid, Ordering::Acquire, Ordering::Relaxed) + .compare_exchange(UID_UNLOCKED, uid, Ordering::Acquire, Ordering::Relaxed) } fn unlock(&self) -> u64 { - self.lock.swap(0, Ordering::Release) + self.lock.swap(UID_UNLOCKED, Ordering::Release) } fn uid(&self) -> u64 { self.lock.load(Ordering::Relaxed) @@ -133,7 +136,7 @@ impl BucketStorage { if ix >= self.num_cells() { panic!("allocate: bad index size"); } - if 0 == uid { + if UID_UNLOCKED == uid { panic!("allocate: bad uid"); } let mut e = Err(BucketStorageError::AlreadyAllocated); @@ -154,7 +157,7 @@ impl BucketStorage { if ix >= self.num_cells() { panic!("free: bad index size"); } - if 0 == uid { + if UID_UNLOCKED == uid { panic!("free: bad uid"); } let ix = (ix * self.cell_size) as usize;