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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
use super::*;
pub struct RecvBurstIterator<'a, Up: Send + 'static> {
receiver: &'a Receiver<UpMsg<Up>>,
buffer_prev: &'a mut Option<UpMsg<Up>>,
start: Instant
}
impl<'a, Up: Send + 'static> RecvBurstIterator<'a, Up> {
#[inline]
pub fn new(
receiver: &'a Receiver<UpMsg<Up>>,
buffer_prev: &'a mut Option<UpMsg<Up>>,
start: Instant
) -> Self {
Self {
receiver,
buffer_prev,
start
}
}
}
impl<'a, Up: Send + 'static> Iterator for RecvBurstIterator<'a, Up> {
type Item = Up;
#[inline]
fn next(&mut self) -> Option<Up> {
if let Some(ref prev) = self.buffer_prev {
if prev.time() > self.start {
return None
} else {
return std::mem::replace(self.buffer_prev, None).map(|m| m.get());
}
}
match self.receiver.try_recv() {
Ok(msg) => {
if msg.time() > self.start {
*self.buffer_prev = Some(msg);
None
} else {
Some(msg.get())
}
}
Err(_) => None
}
}
}
pub struct RecvAllIterator<Up: Send + 'static> {
receiver: Receiver<UpMsg<Up>>,
buffer_prev: Option<UpMsg<Up>>,
workers: Vec<JoinHandle<()>>,
}
impl<Up: Send + 'static> RecvAllIterator<Up> {
pub fn new(
receiver: Receiver<UpMsg<Up>>,
buffer_prev: Option<UpMsg<Up>>,
workers: Vec<JoinHandle<()>>,
) -> Self {
Self {
receiver: receiver,
buffer_prev,
workers,
}
}
}
impl<Up: Send + 'static> Iterator for RecvAllIterator<Up> {
type Item = Up;
#[inline]
fn next(&mut self) -> Option<Up> {
if self.buffer_prev.is_some() {
let buffer_prev = std::mem::replace(&mut self.buffer_prev, None);
return Some(buffer_prev.unwrap().get());
}
if let Ok(msg) = self.receiver.recv() {
Some(msg.get())
} else {
for worker in std::mem::replace(&mut self.workers, Vec::new()) {
match worker.join() {
Ok(_) => {}
Err(e) => std::panic::resume_unwind(e)
}
}
None
}
}
}
impl<Up: Send + 'static> std::iter::FusedIterator for RecvAllIterator<Up> {}