| #![feature(test)] |
| #![cfg(feature = "bilock")] |
| |
| extern crate test; |
| |
| use futures::task::Poll; |
| use futures_test::task::noop_context; |
| use futures_util::lock::BiLock; |
| |
| use crate::test::Bencher; |
| |
| #[bench] |
| fn contended(b: &mut Bencher) { |
| let mut context = noop_context(); |
| |
| b.iter(|| { |
| let (x, y) = BiLock::new(1); |
| |
| for _ in 0..1000 { |
| let x_guard = match x.poll_lock(&mut context) { |
| Poll::Ready(guard) => guard, |
| _ => panic!(), |
| }; |
| |
| // Try poll second lock while first lock still holds the lock |
| match y.poll_lock(&mut context) { |
| Poll::Pending => (), |
| _ => panic!(), |
| }; |
| |
| drop(x_guard); |
| |
| let y_guard = match y.poll_lock(&mut context) { |
| Poll::Ready(guard) => guard, |
| _ => panic!(), |
| }; |
| |
| drop(y_guard); |
| } |
| (x, y) |
| }); |
| } |
| |
| #[bench] |
| fn lock_unlock(b: &mut Bencher) { |
| let mut context = noop_context(); |
| |
| b.iter(|| { |
| let (x, y) = BiLock::new(1); |
| |
| for _ in 0..1000 { |
| let x_guard = match x.poll_lock(&mut context) { |
| Poll::Ready(guard) => guard, |
| _ => panic!(), |
| }; |
| |
| drop(x_guard); |
| |
| let y_guard = match y.poll_lock(&mut context) { |
| Poll::Ready(guard) => guard, |
| _ => panic!(), |
| }; |
| |
| drop(y_guard); |
| } |
| (x, y) |
| }) |
| } |