1
- use bitvec:: { bitvec, vec:: BitVec } ;
2
1
use core:: task:: Waker ;
2
+ use fixedbitset:: FixedBitSet ;
3
3
4
4
/// Tracks which wakers are "ready" and should be polled.
5
5
#[ derive( Debug ) ]
6
6
pub ( crate ) struct ReadinessVec {
7
7
ready_count : usize ,
8
8
max_count : usize ,
9
- readiness_list : BitVec ,
9
+ readiness_list : FixedBitSet ,
10
10
parent_waker : Option < Waker > ,
11
11
}
12
12
@@ -16,7 +16,8 @@ impl ReadinessVec {
16
16
Self {
17
17
ready_count : len,
18
18
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 ) ) ,
20
21
parent_waker : None ,
21
22
}
22
23
}
@@ -36,7 +37,7 @@ impl ReadinessVec {
36
37
37
38
/// Set all markers to ready.
38
39
pub ( crate ) fn set_all_ready ( & mut self ) {
39
- self . readiness_list . fill ( true ) ;
40
+ self . readiness_list . set_range ( .. , true ) ;
40
41
self . ready_count = self . max_count ;
41
42
}
42
43
@@ -56,7 +57,7 @@ impl ReadinessVec {
56
57
/// Returns whether the task id was previously ready
57
58
#[ allow( unused) ]
58
59
pub ( crate ) fn clear_all_ready ( & mut self ) {
59
- self . readiness_list . fill ( false ) ;
60
+ self . readiness_list . set_range ( .. , false ) ;
60
61
self . ready_count = 0 ;
61
62
}
62
63
@@ -85,8 +86,27 @@ impl ReadinessVec {
85
86
/// If new entries are created, they will be marked as 'ready'.
86
87
pub ( crate ) fn resize ( & mut self , len : usize ) {
87
88
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
+ }
90
110
}
91
111
}
92
112
0 commit comments