@@ -26,15 +26,20 @@ pub fn split<E: Send + 'static>() -> (EventSender<E>, EventReceiver<E>) {
26
26
#[ derive( Clone , Copy , Debug , PartialEq , Eq , Hash ) ]
27
27
pub struct TimerId ( Instant ) ;
28
28
29
+ // Internal enum to enqueue different timer commands in a single queue
30
+ enum TimerCommand < E > {
31
+ Create ( E ) ,
32
+ Cancel ,
33
+ }
34
+
29
35
/// A generic and synchronized queue where the user can send and receive events.
30
36
/// See [`EventSender`] to see how send events.
31
37
/// This entity can be used as an utility for the [`crate::network`] module redirecting the
32
38
/// network events to process them later from here.
33
39
pub struct EventReceiver < E > {
34
40
event_sender : EventSender < E > , // Should be before receiver in order to drop first.
35
41
receiver : Receiver < E > ,
36
- timer_receiver : Receiver < ( Instant , E ) > ,
37
- remove_timer_receiver : Receiver < Instant > ,
42
+ timer_receiver : Receiver < ( Instant , TimerCommand < E > ) > ,
38
43
priority_receiver : Receiver < E > ,
39
44
timers : BTreeMap < Instant , E > ,
40
45
}
@@ -46,18 +51,11 @@ where E: Send + 'static
46
51
fn default ( ) -> Self {
47
52
let ( sender, receiver) = crossbeam_channel:: unbounded ( ) ;
48
53
let ( timer_sender, timer_receiver) = crossbeam_channel:: unbounded ( ) ;
49
- let ( remove_timer_sender, remove_timer_receiver) = crossbeam_channel:: unbounded ( ) ;
50
54
let ( priority_sender, priority_receiver) = crossbeam_channel:: unbounded ( ) ;
51
55
EventReceiver {
52
- event_sender : EventSender :: new (
53
- sender,
54
- timer_sender,
55
- remove_timer_sender,
56
- priority_sender,
57
- ) ,
56
+ event_sender : EventSender :: new ( sender, timer_sender, priority_sender) ,
58
57
receiver,
59
58
timer_receiver,
60
- remove_timer_receiver,
61
59
priority_receiver,
62
60
timers : BTreeMap :: new ( ) ,
63
61
}
@@ -76,11 +74,10 @@ where E: Send + 'static
76
74
77
75
fn enque_timers ( & mut self ) {
78
76
for timer in self . timer_receiver . try_iter ( ) {
79
- self . timers . insert ( timer. 0 , timer. 1 ) ;
80
- }
81
-
82
- for timer_instant in self . remove_timer_receiver . try_iter ( ) {
83
- self . timers . remove ( & timer_instant) ;
77
+ match timer. 1 {
78
+ TimerCommand :: Create ( e) => self . timers . insert ( timer. 0 , e) ,
79
+ TimerCommand :: Cancel => self . timers . remove ( & timer. 0 ) ,
80
+ } ;
84
81
}
85
82
}
86
83
@@ -175,8 +172,7 @@ where E: Send + 'static
175
172
/// This type can only be generated by the receiver `EventReceiver`.
176
173
pub struct EventSender < E > {
177
174
sender : Sender < E > ,
178
- timer_sender : Sender < ( Instant , E ) > ,
179
- remove_timer_sender : Sender < Instant > ,
175
+ timer_sender : Sender < ( Instant , TimerCommand < E > ) > ,
180
176
priority_sender : Sender < E > ,
181
177
}
182
178
@@ -185,11 +181,10 @@ where E: Send + 'static
185
181
{
186
182
fn new (
187
183
sender : Sender < E > ,
188
- timer_sender : Sender < ( Instant , E ) > ,
189
- remove_timer_sender : Sender < Instant > ,
184
+ timer_sender : Sender < ( Instant , TimerCommand < E > ) > ,
190
185
priority_sender : Sender < E > ,
191
186
) -> EventSender < E > {
192
- EventSender { sender, timer_sender, remove_timer_sender , priority_sender }
187
+ EventSender { sender, timer_sender, priority_sender }
193
188
}
194
189
195
190
/// Send instantly an event to the event queue.
@@ -210,14 +205,14 @@ where E: Send + 'static
210
205
/// [`EventSender::cancel_timer()`] be called.
211
206
pub fn send_with_timer ( & self , event : E , duration : Duration ) -> TimerId {
212
207
let when = Instant :: now ( ) + duration;
213
- self . timer_sender . send ( ( when, event) ) . ok ( ) ;
208
+ self . timer_sender . send ( ( when, TimerCommand :: Create ( event) ) ) . ok ( ) ;
214
209
TimerId ( when)
215
210
}
216
211
217
212
/// Remove a timer previously sent by [`EventSender::send_with_timer()`].
218
213
/// The timer will not be receive by the [`EventReceiver`].
219
214
pub fn cancel_timer ( & self , timer_id : TimerId ) {
220
- self . remove_timer_sender . send ( timer_id. 0 ) . ok ( ) ;
215
+ self . timer_sender . send ( ( timer_id. 0 , TimerCommand :: Cancel ) ) . ok ( ) ;
221
216
}
222
217
}
223
218
@@ -228,7 +223,6 @@ where E: Send + 'static
228
223
EventSender :: new (
229
224
self . sender . clone ( ) ,
230
225
self . timer_sender . clone ( ) ,
231
- self . remove_timer_sender . clone ( ) ,
232
226
self . priority_sender . clone ( ) ,
233
227
)
234
228
}
0 commit comments