Skip to content

Commit 6fc22fa

Browse files
committed
Add QueueStrategy to notify tests and benches.
Signed-off-by: Jason Volk <[email protected]>
1 parent b817462 commit 6fc22fa

File tree

2 files changed

+182
-30
lines changed

2 files changed

+182
-30
lines changed

benches/bench.rs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use std::iter;
22

33
use criterion::{criterion_group, criterion_main, Criterion};
4-
use event_listener::{Event, Listener};
4+
use event_listener::{Event, Listener, QueueStrategy};
55

66
const COUNT: usize = 8000;
77

@@ -20,6 +20,21 @@ fn bench_events(c: &mut Criterion) {
2020
}
2121
});
2222
});
23+
24+
c.bench_function("notify_and_wait_lifo", |b| {
25+
let ev = Event::new_with_queue_strategy(QueueStrategy::Lifo);
26+
let mut handles = Vec::with_capacity(COUNT);
27+
28+
b.iter(|| {
29+
handles.extend(iter::repeat_with(|| ev.listen()).take(COUNT));
30+
31+
ev.notify(COUNT);
32+
33+
for handle in handles.drain(..) {
34+
handle.wait();
35+
}
36+
});
37+
});
2338
}
2439

2540
criterion_group!(benches, bench_events);

tests/notify.rs

Lines changed: 166 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use std::pin::Pin;
33
use std::sync::{Arc, Mutex};
44
use std::task::Context;
55

6-
use event_listener::{Event, EventListener};
6+
use event_listener::{Event, EventListener, QueueStrategy};
77
use waker_fn::waker_fn;
88

99
#[cfg(target_family = "wasm")]
@@ -17,8 +17,17 @@ fn is_notified(listener: &mut EventListener) -> bool {
1717
}
1818

1919
#[test]
20-
fn notify() {
21-
let event = Event::new();
20+
fn notify_fifo() {
21+
notify(QueueStrategy::Fifo)
22+
}
23+
24+
#[test]
25+
fn notify_lifo() {
26+
notify(QueueStrategy::Lifo)
27+
}
28+
29+
fn notify(queue_strategy: QueueStrategy) {
30+
let event = Event::new_with_queue_strategy(queue_strategy);
2231

2332
let mut l1 = event.listen();
2433
let mut l2 = event.listen();
@@ -31,14 +40,32 @@ fn notify() {
3140
assert_eq!(event.notify(2), 2);
3241
assert_eq!(event.notify(1), 0);
3342

34-
assert!(is_notified(&mut l1));
35-
assert!(is_notified(&mut l2));
36-
assert!(!is_notified(&mut l3));
43+
match queue_strategy {
44+
QueueStrategy::Fifo => {
45+
assert!(is_notified(&mut l1));
46+
assert!(is_notified(&mut l2));
47+
assert!(!is_notified(&mut l3));
48+
}
49+
QueueStrategy::Lifo => {
50+
assert!(is_notified(&mut l3));
51+
assert!(is_notified(&mut l2));
52+
assert!(!is_notified(&mut l1));
53+
}
54+
}
3755
}
3856

3957
#[test]
40-
fn notify_additional() {
41-
let event = Event::new();
58+
fn notify_additional_fifo() {
59+
notify_additional(QueueStrategy::Fifo)
60+
}
61+
62+
#[test]
63+
fn notify_additional_lifo() {
64+
notify_additional(QueueStrategy::Lifo)
65+
}
66+
67+
fn notify_additional(queue_strategy: QueueStrategy) {
68+
let event = Event::new_with_queue_strategy(queue_strategy);
4269

4370
let mut l1 = event.listen();
4471
let mut l2 = event.listen();
@@ -48,14 +75,32 @@ fn notify_additional() {
4875
assert_eq!(event.notify(1), 0);
4976
assert_eq!(event.notify_additional(1), 1);
5077

51-
assert!(is_notified(&mut l1));
52-
assert!(is_notified(&mut l2));
53-
assert!(!is_notified(&mut l3));
78+
match queue_strategy {
79+
QueueStrategy::Fifo => {
80+
assert!(is_notified(&mut l1));
81+
assert!(is_notified(&mut l2));
82+
assert!(!is_notified(&mut l3));
83+
}
84+
QueueStrategy::Lifo => {
85+
assert!(is_notified(&mut l3));
86+
assert!(is_notified(&mut l2));
87+
assert!(!is_notified(&mut l1));
88+
}
89+
}
5490
}
5591

5692
#[test]
57-
fn notify_one() {
58-
let event = Event::new();
93+
fn notify_one_fifo() {
94+
notify_one(QueueStrategy::Fifo)
95+
}
96+
97+
#[test]
98+
fn notify_one_lifo() {
99+
notify_one(QueueStrategy::Lifo)
100+
}
101+
102+
fn notify_one(queue_strategy: QueueStrategy) {
103+
let event = Event::new_with_queue_strategy(queue_strategy);
59104

60105
let mut l1 = event.listen();
61106
let mut l2 = event.listen();
@@ -64,16 +109,36 @@ fn notify_one() {
64109
assert!(!is_notified(&mut l2));
65110

66111
assert_eq!(event.notify(1), 1);
67-
assert!(is_notified(&mut l1));
68-
assert!(!is_notified(&mut l2));
112+
match queue_strategy {
113+
QueueStrategy::Fifo => {
114+
assert!(is_notified(&mut l1));
115+
assert!(!is_notified(&mut l2));
116+
}
117+
QueueStrategy::Lifo => {
118+
assert!(is_notified(&mut l2));
119+
assert!(!is_notified(&mut l1));
120+
}
121+
}
69122

70123
assert_eq!(event.notify(1), 1);
71-
assert!(is_notified(&mut l2));
124+
match queue_strategy {
125+
QueueStrategy::Fifo => assert!(is_notified(&mut l2)),
126+
QueueStrategy::Lifo => assert!(is_notified(&mut l1)),
127+
}
72128
}
73129

74130
#[test]
75-
fn notify_all() {
76-
let event = Event::new();
131+
fn notify_all_fifo() {
132+
notify_all(QueueStrategy::Fifo)
133+
}
134+
135+
#[test]
136+
fn notify_all_lifo() {
137+
notify_all(QueueStrategy::Lifo)
138+
}
139+
140+
fn notify_all(queue_strategy: QueueStrategy) {
141+
let event = Event::new_with_queue_strategy(queue_strategy);
77142

78143
let mut l1 = event.listen();
79144
let mut l2 = event.listen();
@@ -87,8 +152,8 @@ fn notify_all() {
87152
}
88153

89154
#[test]
90-
fn drop_notified() {
91-
let event = Event::new();
155+
fn drop_notified_fifo() {
156+
let event = Event::new_with_queue_strategy(QueueStrategy::Fifo);
92157

93158
let l1 = event.listen();
94159
let mut l2 = event.listen();
@@ -101,8 +166,22 @@ fn drop_notified() {
101166
}
102167

103168
#[test]
104-
fn drop_notified2() {
105-
let event = Event::new();
169+
fn drop_notified_lifo() {
170+
let event = Event::new_with_queue_strategy(QueueStrategy::Lifo);
171+
172+
let mut l1 = event.listen();
173+
let mut l2 = event.listen();
174+
let l3 = event.listen();
175+
176+
assert_eq!(event.notify(1), 1);
177+
drop(l3);
178+
assert!(is_notified(&mut l2));
179+
assert!(!is_notified(&mut l1));
180+
}
181+
182+
#[test]
183+
fn drop_notified2_fifo() {
184+
let event = Event::new_with_queue_strategy(QueueStrategy::Fifo);
106185

107186
let l1 = event.listen();
108187
let mut l2 = event.listen();
@@ -115,8 +194,22 @@ fn drop_notified2() {
115194
}
116195

117196
#[test]
118-
fn drop_notified_additional() {
119-
let event = Event::new();
197+
fn drop_notified2_lifo() {
198+
let event = Event::new_with_queue_strategy(QueueStrategy::Lifo);
199+
200+
let mut l1 = event.listen();
201+
let mut l2 = event.listen();
202+
let l3 = event.listen();
203+
204+
assert_eq!(event.notify(2), 2);
205+
drop(l3);
206+
assert!(is_notified(&mut l2));
207+
assert!(!is_notified(&mut l1));
208+
}
209+
210+
#[test]
211+
fn drop_notified_additional_fifo() {
212+
let event = Event::new_with_queue_strategy(QueueStrategy::Fifo);
120213

121214
let l1 = event.listen();
122215
let mut l2 = event.listen();
@@ -132,8 +225,25 @@ fn drop_notified_additional() {
132225
}
133226

134227
#[test]
135-
fn drop_non_notified() {
136-
let event = Event::new();
228+
fn drop_notified_additional_lifo() {
229+
let event = Event::new_with_queue_strategy(QueueStrategy::Lifo);
230+
231+
let mut l1 = event.listen();
232+
let mut l2 = event.listen();
233+
let mut l3 = event.listen();
234+
let l4 = event.listen();
235+
236+
assert_eq!(event.notify_additional(1), 1);
237+
assert_eq!(event.notify(2), 1);
238+
drop(l4);
239+
assert!(is_notified(&mut l3));
240+
assert!(is_notified(&mut l2));
241+
assert!(!is_notified(&mut l1));
242+
}
243+
244+
#[test]
245+
fn drop_non_notified_fifo() {
246+
let event = Event::new_with_queue_strategy(QueueStrategy::Fifo);
137247

138248
let mut l1 = event.listen();
139249
let mut l2 = event.listen();
@@ -146,8 +256,31 @@ fn drop_non_notified() {
146256
}
147257

148258
#[test]
149-
fn notify_all_fair() {
150-
let event = Event::new();
259+
fn drop_non_notified_lifo() {
260+
let event = Event::new_with_queue_strategy(QueueStrategy::Lifo);
261+
262+
let l1 = event.listen();
263+
let mut l2 = event.listen();
264+
let mut l3 = event.listen();
265+
266+
assert_eq!(event.notify(1), 1);
267+
drop(l1);
268+
assert!(is_notified(&mut l3));
269+
assert!(!is_notified(&mut l2));
270+
}
271+
272+
#[test]
273+
fn notify_all_fair_fifo() {
274+
notify_all_fair(QueueStrategy::Fifo)
275+
}
276+
277+
#[test]
278+
fn notify_all_fair_lifo() {
279+
notify_all_fair(QueueStrategy::Lifo)
280+
}
281+
282+
fn notify_all_fair(queue_strategy: QueueStrategy) {
283+
let event = Event::new_with_queue_strategy(queue_strategy);
151284
let v = Arc::new(Mutex::new(vec![]));
152285

153286
let mut l1 = event.listen();
@@ -178,7 +311,11 @@ fn notify_all_fair() {
178311
.is_pending());
179312

180313
assert_eq!(event.notify(usize::MAX), 3);
181-
assert_eq!(&*v.lock().unwrap(), &[1, 2, 3]);
314+
315+
match queue_strategy {
316+
QueueStrategy::Fifo => assert_eq!(&*v.lock().unwrap(), &[1, 2, 3]),
317+
QueueStrategy::Lifo => assert_eq!(&*v.lock().unwrap(), &[3, 2, 1]),
318+
}
182319

183320
assert!(Pin::new(&mut l1)
184321
.poll(&mut Context::from_waker(&waker1))

0 commit comments

Comments
 (0)