1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
use bitvec::{bitvec, vec::BitVec};
use std::task::Waker;
#[derive(Debug)]
pub(crate) struct ReadinessVec {
count: usize,
max_count: usize,
ready: BitVec,
parent_waker: Option<Waker>,
}
impl ReadinessVec {
pub(crate) fn new(count: usize) -> Self {
Self {
count,
max_count: count,
ready: bitvec![true as usize; count],
parent_waker: None,
}
}
pub(crate) fn set_ready(&mut self, id: usize) -> bool {
if !self.ready[id] {
self.count += 1;
self.ready.set(id, true);
false
} else {
true
}
}
pub(crate) fn set_all_ready(&mut self) {
self.ready.fill(true);
self.count = self.max_count;
}
pub(crate) fn clear_ready(&mut self, id: usize) -> bool {
if self.ready[id] {
self.count -= 1;
self.ready.set(id, false);
true
} else {
false
}
}
pub(crate) fn any_ready(&self) -> bool {
self.count > 0
}
#[inline]
pub(crate) fn parent_waker(&self) -> Option<&Waker> {
self.parent_waker.as_ref()
}
pub(crate) fn set_waker(&mut self, parent_waker: &Waker) {
self.parent_waker = Some(parent_waker.clone());
}
}