Skip to content

Commit 67a5a6e

Browse files
committed
AtomicBitset::reset method to set a particular bit to 0
1 parent c57d777 commit 67a5a6e

File tree

1 file changed

+15
-9
lines changed

1 file changed

+15
-9
lines changed

src/sync/bitset.rs

+15-9
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,14 @@ impl AtomicBitset {
3030
self.words[index >> WORD_SIZE_SHIFT].fetch_or(mask, ordering);
3131
}
3232

33+
#[inline]
34+
pub fn reset(&self, index: usize, ordering: Ordering) {
35+
assert!(index < self.len);
36+
37+
let mask = 1 << (index & WORD_SIZE_MASK);
38+
self.words[index >> WORD_SIZE_SHIFT].fetch_and(!mask, ordering);
39+
}
40+
3341
#[inline]
3442
pub fn get(&self, index: usize, ordering: Ordering) -> bool {
3543
assert!(index < self.len);
@@ -93,17 +101,15 @@ mod tests {
93101
fn set_get() {
94102
let bitset = AtomicBitset::with_len(8);
95103

96-
assert!(!bitset.get(0, Ordering::Relaxed));
97-
bitset.set(0, Ordering::Relaxed);
98-
assert!(bitset.get(0, Ordering::Relaxed));
104+
for index in 0..8 {
105+
assert!(!bitset.get(index, Ordering::Relaxed));
99106

100-
assert!(!bitset.get(3, Ordering::Relaxed));
101-
bitset.set(3, Ordering::Relaxed);
102-
assert!(bitset.get(3, Ordering::Relaxed));
107+
bitset.set(index, Ordering::Relaxed);
108+
assert!(bitset.get(index, Ordering::Relaxed));
103109

104-
assert!(!bitset.get(7, Ordering::Relaxed));
105-
bitset.set(7, Ordering::Relaxed);
106-
assert!(bitset.get(7, Ordering::Relaxed));
110+
bitset.reset(index, Ordering::Relaxed);
111+
assert!(!bitset.get(index, Ordering::Relaxed));
112+
}
107113
}
108114

109115
#[test]

0 commit comments

Comments
 (0)