• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #![feature(test)]
2 #![cfg(feature = "bilock")]
3 
4 extern crate test;
5 
6 use futures::task::Poll;
7 use futures_test::task::noop_context;
8 use futures_util::lock::BiLock;
9 
10 use crate::test::Bencher;
11 
12 #[bench]
contended(b: &mut Bencher)13 fn contended(b: &mut Bencher) {
14     let mut context = noop_context();
15 
16     b.iter(|| {
17         let (x, y) = BiLock::new(1);
18 
19         for _ in 0..1000 {
20             let x_guard = match x.poll_lock(&mut context) {
21                 Poll::Ready(guard) => guard,
22                 _ => panic!(),
23             };
24 
25             // Try poll second lock while first lock still holds the lock
26             match y.poll_lock(&mut context) {
27                 Poll::Pending => (),
28                 _ => panic!(),
29             };
30 
31             drop(x_guard);
32 
33             let y_guard = match y.poll_lock(&mut context) {
34                 Poll::Ready(guard) => guard,
35                 _ => panic!(),
36             };
37 
38             drop(y_guard);
39         }
40         (x, y)
41     });
42 }
43 
44 #[bench]
lock_unlock(b: &mut Bencher)45 fn lock_unlock(b: &mut Bencher) {
46     let mut context = noop_context();
47 
48     b.iter(|| {
49         let (x, y) = BiLock::new(1);
50 
51         for _ in 0..1000 {
52             let x_guard = match x.poll_lock(&mut context) {
53                 Poll::Ready(guard) => guard,
54                 _ => panic!(),
55             };
56 
57             drop(x_guard);
58 
59             let y_guard = match y.poll_lock(&mut context) {
60                 Poll::Ready(guard) => guard,
61                 _ => panic!(),
62             };
63 
64             drop(y_guard);
65         }
66         (x, y)
67     })
68 }
69