11//! Worker that decodes `RaptorQ` packets into protocol blocks
22
33use crate :: { protocol, receive} ;
4- use std:: { sync , thread} ;
4+ use std:: thread;
55
66pub fn start < ClientNew , ClientEnd > (
77 receiver : & receive:: Receiver < ClientNew , ClientEnd > ,
88) -> Result < ( ) , receive:: Error > {
99 loop {
1010 match receiver. for_decode . recv ( ) ? {
1111 super :: Reassembled :: Block { id, packets } => {
12+ log:: debug!( "received block {id} to decode" ) ;
13+
1214 match receiver. raptorq . decode ( id, packets) {
1315 None => {
1416 log:: error!( "lost block {id} (failed to decode)" ) ;
@@ -17,23 +19,32 @@ pub fn start<ClientNew, ClientEnd>(
1719 Some ( block) => {
1820 log:: debug!( "block {id} decoded with {} bytes!" , block. len( ) ) ;
1921
20- ' inner: loop {
21- let block_to_dispatch = receiver
22- . block_to_dispatch
23- . load ( sync:: atomic:: Ordering :: SeqCst ) ;
24-
25- if block_to_dispatch == id {
26- receiver
27- . to_dispatch
28- . send ( Some ( protocol:: Block :: deserialize ( block) ) ) ?;
29- receiver
30- . block_to_dispatch
31- . fetch_add ( 1 , sync:: atomic:: Ordering :: SeqCst ) ;
32- break ' inner;
33- }
34-
35- thread:: yield_now ( ) ;
36- }
22+ let mut block_to_dispatch =
23+ receiver. block_to_dispatch . 0 . lock ( ) . map_err ( |e| {
24+ receive:: Error :: Other ( format ! (
25+ "failed to acquire block_to_dispatch mutex: {e}"
26+ ) )
27+ } ) ?;
28+
29+ block_to_dispatch = receiver
30+ . block_to_dispatch
31+ . 1
32+ . wait_while ( block_to_dispatch, |block_to_dispatch| {
33+ * block_to_dispatch != id
34+ } )
35+ . map_err ( |e| {
36+ receive:: Error :: Other ( format ! (
37+ "failed to wait_while block_to_dispatch mutex: {e}"
38+ ) )
39+ } ) ?;
40+
41+ receiver
42+ . to_dispatch
43+ . send ( Some ( protocol:: Block :: deserialize ( block) ) ) ?;
44+
45+ * block_to_dispatch = block_to_dispatch. wrapping_add ( 1 ) ;
46+ drop ( block_to_dispatch) ;
47+ receiver. block_to_dispatch . 1 . notify_all ( ) ;
3748 }
3849 }
3950 }
0 commit comments