@@ -11,7 +11,8 @@ use super::{RowData, Worker};
11
11
use super :: immediate:: ImmediateWorker ;
12
12
13
13
pub 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)
15
16
}
16
17
17
18
enum WorkerMsg {
@@ -25,8 +26,6 @@ pub struct MpscWorker {
25
26
senders : [ Option < Sender < WorkerMsg > > ; MAX_COMPONENTS ]
26
27
}
27
28
28
- pub struct StdThreadWorker ( MpscWorker ) ;
29
-
30
29
impl MpscWorker {
31
30
fn start_with (
32
31
& mut self ,
@@ -43,17 +42,15 @@ impl MpscWorker {
43
42
// we do the "take out value and put it back in once we're done" dance here
44
43
// and in all other message-passing methods because there's not that many rows
45
44
// 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 ( ) ;
47
46
sender. send ( WorkerMsg :: Start ( row_data) ) . expect ( "jpeg-decoder worker thread error" ) ;
48
- self . senders [ component] = Some ( sender) ;
49
47
Ok ( ( ) )
50
48
}
51
49
52
50
fn append_row ( & mut self , row : ( usize , Vec < i16 > ) ) -> Result < ( ) > {
53
51
let component = row. 0 ;
54
- let sender = mem :: replace ( & mut self . senders [ component] , None ) . unwrap ( ) ;
52
+ let sender = self . senders [ component] . as_mut ( ) . unwrap ( ) ;
55
53
sender. send ( WorkerMsg :: AppendRow ( row. 1 ) ) . expect ( "jpeg-decoder worker thread error" ) ;
56
- self . senders [ component] = Some ( sender) ;
57
54
Ok ( ( ) )
58
55
}
59
56
@@ -63,21 +60,21 @@ impl MpscWorker {
63
60
collect : impl FnOnce ( Receiver < Vec < u8 > > ) -> Vec < u8 > ,
64
61
) -> Result < Vec < u8 > > {
65
62
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 ( ) ;
67
64
sender. send ( WorkerMsg :: GetResult ( tx) ) . expect ( "jpeg-decoder worker thread error" ) ;
68
65
Ok ( collect ( rx) )
69
66
}
70
67
}
71
68
72
- impl Worker for StdThreadWorker {
69
+ impl Worker for MpscWorker {
73
70
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)
75
72
}
76
73
fn append_row ( & mut self , row : ( usize , Vec < i16 > ) ) -> Result < ( ) > {
77
- self . 0 . append_row ( row)
74
+ MpscWorker :: append_row ( self , row)
78
75
}
79
76
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)
81
78
}
82
79
}
83
80
@@ -117,13 +114,6 @@ fn spawn_worker_thread(component: usize) -> Result<Sender<WorkerMsg>> {
117
114
Ok ( tx)
118
115
}
119
116
120
-
121
117
fn collect_worker_thread ( rx : Receiver < Vec < u8 > > ) -> Vec < u8 > {
122
118
rx. recv ( ) . expect ( "jpeg-decoder worker thread error" )
123
119
}
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