@@ -112,6 +112,9 @@ fn decode_spec(coding: Arc<Coding<u8>>, bits: Arc<Vec<bool>>) {
112
112
let cursor = Arc :: new ( AtomicUsize :: new ( 0 ) ) ;
113
113
114
114
loop {
115
+ if cursor. load ( Ordering :: SeqCst ) == bits. len ( ) {
116
+ break ;
117
+ } ;
115
118
let unique_code_lengths: HashSet < u32 > = coding. code_lengths ( ) . values ( ) . cloned ( ) . collect ( ) ;
116
119
let mut sorted_code_lengths: Vec < u32 > = Vec :: from_iter ( unique_code_lengths) ;
117
120
sorted_code_lengths. sort_unstable ( ) ; // sort_unstable is often faster and appropriate here
@@ -144,28 +147,35 @@ fn decode_spec(coding: Arc<Coding<u8>>, bits: Arc<Vec<bool>>) {
144
147
let bits_arc = Arc :: clone ( & bits) ;
145
148
let coding_arc = Arc :: clone ( & coding) ;
146
149
let cursor_arc = Arc :: clone ( & cursor) ;
150
+ let start_index = cursor_arc. load ( Ordering :: SeqCst ) + l as usize ;
151
+ if start_index > bits_arc. len ( ) {
152
+ break ;
153
+ } ;
147
154
let handle = thread:: spawn ( move || {
148
155
let mut len = 0 ;
149
156
let mut decoder = coding_arc. decoder ( ) ;
150
- let start_index = cursor_arc . load ( Ordering :: SeqCst ) + l as usize ;
157
+
151
158
let mut bits_iter = bits_arc[ start_index..] . into_iter ( ) ;
152
159
while let Some ( b) = bits_iter. next ( ) {
153
160
len += 1 ;
154
161
if let minimum_redundancy:: DecodingResult :: Value ( v) =
155
162
decoder. consume ( & coding_arc, * b as u32 )
156
163
{
157
164
black_box ( v) ;
158
- return len;
165
+ return Some ( len) ;
159
166
}
160
167
}
161
- panic ! ( "invalid encoded value" ) ;
168
+ None
162
169
} ) ;
163
170
handles. insert ( l, handle) ;
164
171
}
165
172
let producer_len = producer_handle. join ( ) . unwrap ( ) ;
166
173
if let Some ( handle) = handles. remove ( & producer_len) {
167
- let guess_len = handle. join ( ) . unwrap ( ) ;
168
- cursor. fetch_add ( ( producer_len + guess_len) as usize , Ordering :: SeqCst ) ;
174
+ if let Some ( guess_len) = handle. join ( ) . unwrap ( ) {
175
+ cursor. fetch_add ( ( producer_len + guess_len) as usize , Ordering :: SeqCst ) ;
176
+ } else {
177
+ cursor. fetch_add ( ( producer_len) as usize , Ordering :: SeqCst ) ;
178
+ }
169
179
} else {
170
180
cursor. fetch_add ( ( producer_len) as usize , Ordering :: SeqCst ) ;
171
181
}
@@ -354,11 +364,11 @@ pub fn benchmark(conf: &super::Conf) {
354
364
BitsPerFragment ( 1 ) ,
355
365
& frequencies,
356
366
) ) ;
357
- let iter = bits. clone ( ) . into_iter ( ) ;
358
- conf. print_speed (
359
- " decoding from a queue (without storing)" ,
360
- conf. measure ( || decode ( & coding, iter. clone ( ) ) ) ,
361
- ) ;
367
+ // let iter = bits.clone().into_iter();
368
+ // conf.print_speed(
369
+ // " decoding from a queue (without storing)",
370
+ // conf.measure(|| decode(&coding, iter.clone())),
371
+ // );
362
372
let bits_arc = Arc :: new ( bits) ;
363
373
conf. print_speed (
364
374
" decoding from a queue (without storing) using speculative execution" ,
0 commit comments