Skip to content

Commit a79d3df

Browse files
authored
Merge pull request #191 from crepererum/crepererum/issue190
chore: replace `bitvec` with `fixedbitset`
2 parents 1425c21 + 40edf66 commit a79d3df

File tree

2 files changed

+29
-9
lines changed

2 files changed

+29
-9
lines changed

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,10 @@ harness = false
2929
[features]
3030
default = ["std"]
3131
std = ["alloc"]
32-
alloc = ["bitvec/alloc", "dep:slab", "dep:smallvec"]
32+
alloc = ["dep:fixedbitset", "dep:slab", "dep:smallvec"]
3333

3434
[dependencies]
35-
bitvec = { version = "1.0.1", default-features = false, features = ["alloc"] }
35+
fixedbitset = { version = "0.5.7", default-features = false, optional = true }
3636
futures-core = { version = "0.3", default-features = false }
3737
futures-lite = "1.12.0"
3838
pin-project = "1.0.8"

src/utils/wakers/vec/readiness_vec.rs

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
use bitvec::{bitvec, vec::BitVec};
21
use core::task::Waker;
2+
use fixedbitset::FixedBitSet;
33

44
/// Tracks which wakers are "ready" and should be polled.
55
#[derive(Debug)]
66
pub(crate) struct ReadinessVec {
77
ready_count: usize,
88
max_count: usize,
9-
readiness_list: BitVec,
9+
readiness_list: FixedBitSet,
1010
parent_waker: Option<Waker>,
1111
}
1212

@@ -16,7 +16,8 @@ impl ReadinessVec {
1616
Self {
1717
ready_count: len,
1818
max_count: len,
19-
readiness_list: bitvec![true as usize; len],
19+
// See https://github.com/petgraph/fixedbitset/issues/101
20+
readiness_list: FixedBitSet::with_capacity_and_blocks(len, std::iter::repeat(!0)),
2021
parent_waker: None,
2122
}
2223
}
@@ -36,7 +37,7 @@ impl ReadinessVec {
3637

3738
/// Set all markers to ready.
3839
pub(crate) fn set_all_ready(&mut self) {
39-
self.readiness_list.fill(true);
40+
self.readiness_list.set_range(.., true);
4041
self.ready_count = self.max_count;
4142
}
4243

@@ -56,7 +57,7 @@ impl ReadinessVec {
5657
/// Returns whether the task id was previously ready
5758
#[allow(unused)]
5859
pub(crate) fn clear_all_ready(&mut self) {
59-
self.readiness_list.fill(false);
60+
self.readiness_list.set_range(.., false);
6061
self.ready_count = 0;
6162
}
6263

@@ -85,8 +86,27 @@ impl ReadinessVec {
8586
/// If new entries are created, they will be marked as 'ready'.
8687
pub(crate) fn resize(&mut self, len: usize) {
8788
self.max_count = len;
88-
self.readiness_list.resize(len, true);
89-
self.ready_count = self.readiness_list.iter_ones().count();
89+
90+
let old_len = self.readiness_list.len();
91+
match len.cmp(&old_len) {
92+
std::cmp::Ordering::Less => {
93+
// shrink
94+
self.ready_count -= self.readiness_list.count_ones(len..);
95+
self.readiness_list = FixedBitSet::with_capacity_and_blocks(
96+
len,
97+
self.readiness_list.as_slice().iter().cloned(),
98+
);
99+
}
100+
std::cmp::Ordering::Equal => {
101+
// no-op
102+
}
103+
std::cmp::Ordering::Greater => {
104+
// grow
105+
self.readiness_list.grow(len);
106+
self.readiness_list.set_range(old_len..len, true);
107+
self.ready_count += len - old_len;
108+
}
109+
}
90110
}
91111
}
92112

0 commit comments

Comments
 (0)