1 use error::Result;
2 use std::sync::mpsc::{self, Sender};
3 use std::thread;
4 use super::{RowData, Worker};
5 use super::immediate::ImmediateWorker;
6 
7 enum WorkerMsg {
8     Start(RowData),
9     AppendRow((usize, Vec<i16>)),
10     GetResult((usize, Sender<Vec<u8>>)),
11 }
12 
13 pub struct ThreadedWorker {
14     sender: Sender<WorkerMsg>,
15 }
16 
17 impl Worker for ThreadedWorker {
new() -> Result<Self>18     fn new() -> Result<Self> {
19         let thread_builder = thread::Builder::new().name("worker thread".to_owned());
20         let (tx, rx) = mpsc::channel();
21 
22         thread_builder.spawn(move || {
23             let mut worker = ImmediateWorker::new_immediate();
24 
25             while let Ok(message) = rx.recv() {
26                 match message {
27                     WorkerMsg::Start(data) => {
28                         worker.start_immediate(data);
29                     },
30                     WorkerMsg::AppendRow(row) => {
31                         worker.append_row_immediate(row);
32                     },
33                     WorkerMsg::GetResult((index, chan)) => {
34                         let _ = chan.send(worker.get_result_immediate(index));
35                     },
36                 }
37             }
38         })?;
39 
40         Ok(ThreadedWorker { sender: tx })
41     }
start(&mut self, row_data: RowData) -> Result<()>42     fn start(&mut self, row_data: RowData) -> Result<()> {
43         Ok(self.sender.send(WorkerMsg::Start(row_data))?)
44     }
append_row(&mut self, row: (usize, Vec<i16>)) -> Result<()>45     fn append_row(&mut self, row: (usize, Vec<i16>)) -> Result<()> {
46         Ok(self.sender.send(WorkerMsg::AppendRow(row))?)
47     }
get_result(&mut self, index: usize) -> Result<Vec<u8>>48     fn get_result(&mut self, index: usize) -> Result<Vec<u8>> {
49         let (tx, rx) = mpsc::channel();
50         self.sender.send(WorkerMsg::GetResult((index, tx)))?;
51         Ok(rx.recv()?)
52     }
53 }
54