@@ -11,7 +11,8 @@ use super::{RowData, Worker};
1111use super :: immediate:: ImmediateWorker ;
1212
1313pub fn with_multithreading < T > ( f : impl FnOnce ( & mut dyn Worker ) -> T ) -> T {
14- self :: enter_threads ( f)
14+ let mut worker = MpscWorker :: default ( ) ;
15+ f ( & mut worker)
1516}
1617
1718enum WorkerMsg {
@@ -25,8 +26,6 @@ pub struct MpscWorker {
2526 senders : [ Option < Sender < WorkerMsg > > ; MAX_COMPONENTS ]
2627}
2728
28- pub struct StdThreadWorker ( MpscWorker ) ;
29-
3029impl MpscWorker {
3130 fn start_with (
3231 & mut self ,
@@ -43,17 +42,15 @@ impl MpscWorker {
4342 // we do the "take out value and put it back in once we're done" dance here
4443 // and in all other message-passing methods because there's not that many rows
4544 // and this should be cheaper than spawning MAX_COMPONENTS many threads up front
46- let sender = mem :: replace ( & mut self . senders [ component] , None ) . unwrap ( ) ;
45+ let sender = self . senders [ component] . as_mut ( ) . unwrap ( ) ;
4746 sender. send ( WorkerMsg :: Start ( row_data) ) . expect ( "jpeg-decoder worker thread error" ) ;
48- self . senders [ component] = Some ( sender) ;
4947 Ok ( ( ) )
5048 }
5149
5250 fn append_row ( & mut self , row : ( usize , Vec < i16 > ) ) -> Result < ( ) > {
5351 let component = row. 0 ;
54- let sender = mem :: replace ( & mut self . senders [ component] , None ) . unwrap ( ) ;
52+ let sender = self . senders [ component] . as_mut ( ) . unwrap ( ) ;
5553 sender. send ( WorkerMsg :: AppendRow ( row. 1 ) ) . expect ( "jpeg-decoder worker thread error" ) ;
56- self . senders [ component] = Some ( sender) ;
5754 Ok ( ( ) )
5855 }
5956
@@ -63,21 +60,21 @@ impl MpscWorker {
6360 collect : impl FnOnce ( Receiver < Vec < u8 > > ) -> Vec < u8 > ,
6461 ) -> Result < Vec < u8 > > {
6562 let ( tx, rx) = mpsc:: channel ( ) ;
66- let sender = mem:: replace ( & mut self . senders [ index] , None ) . unwrap ( ) ;
63+ let sender = mem:: take ( & mut self . senders [ index] ) . unwrap ( ) ;
6764 sender. send ( WorkerMsg :: GetResult ( tx) ) . expect ( "jpeg-decoder worker thread error" ) ;
6865 Ok ( collect ( rx) )
6966 }
7067}
7168
72- impl Worker for StdThreadWorker {
69+ impl Worker for MpscWorker {
7370 fn start ( & mut self , row_data : RowData ) -> Result < ( ) > {
74- self . 0 . start_with ( row_data, spawn_worker_thread)
71+ self . start_with ( row_data, spawn_worker_thread)
7572 }
7673 fn append_row ( & mut self , row : ( usize , Vec < i16 > ) ) -> Result < ( ) > {
77- self . 0 . append_row ( row)
74+ MpscWorker :: append_row ( self , row)
7875 }
7976 fn get_result ( & mut self , index : usize ) -> Result < Vec < u8 > > {
80- self . 0 . get_result_with ( index, collect_worker_thread)
77+ self . get_result_with ( index, collect_worker_thread)
8178 }
8279}
8380
@@ -117,13 +114,6 @@ fn spawn_worker_thread(component: usize) -> Result<Sender<WorkerMsg>> {
117114 Ok ( tx)
118115}
119116
120-
121117fn collect_worker_thread ( rx : Receiver < Vec < u8 > > ) -> Vec < u8 > {
122118 rx. recv ( ) . expect ( "jpeg-decoder worker thread error" )
123119}
124-
125- #[ allow( dead_code) ]
126- fn enter_threads < T > ( f : impl FnOnce ( & mut dyn Worker ) -> T ) -> T {
127- let mut worker = StdThreadWorker ( MpscWorker :: default ( ) ) ;
128- f ( & mut worker)
129- }
0 commit comments