1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
use crate::{Message, Task, TaskProvider};
use std::sync::{mpsc, Arc, Mutex};
use futures::executor::block_on;
pub fn worker<T: TaskProvider>(
tx: mpsc::Sender<Task>,
rx: Arc<Mutex<mpsc::Receiver<Task>>>,
provider: T,
) {
loop {
let task = rx
.lock()
.map_err(|e| {
error!("Error trying to lock the task channel: {}", e);
e
})
.unwrap()
.recv()
.map_err(|e| {
error!(
"Error trying to receive a task from the respective channel: {}",
e
);
e
})
.unwrap();
match task {
Task::Socket(stream) => {
let mut p = provider.clone();
p.set_socket(stream);
let message = block_on(p);
if Message::ShouldQuit == message {
tx.send(Task::Message(Message::ShouldQuit))
.map_err(|e| {
error!(
"Error trying to send a ShouldQuit message to the task channel: {}",
e
);
e
})
.unwrap();
}
}
Task::Message(m) if m == Message::ShouldQuit => {
tx.send(Task::Message(Message::ShouldQuit))
.map_err(|e| {
error!(
"Error trying to send a ShouldQuit message to the task channel: {}",
e
);
e
})
.unwrap();
break;
}
_ => (),
}
}
}