aboutsummaryrefslogtreecommitdiff
path: root/tests/lock_mutex.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/lock_mutex.rs')
-rw-r--r--tests/lock_mutex.rs50
1 files changed, 26 insertions, 24 deletions
diff --git a/tests/lock_mutex.rs b/tests/lock_mutex.rs
index c92ef50..c15e76b 100644
--- a/tests/lock_mutex.rs
+++ b/tests/lock_mutex.rs
@@ -34,34 +34,36 @@ fn mutex_wakes_waiters() {
assert!(waiter.poll_unpin(&mut panic_context()).is_ready());
}
-#[cfg_attr(miri, ignore)] // https://github.com/rust-lang/miri/issues/1038
#[test]
fn mutex_contested() {
- let (tx, mut rx) = mpsc::unbounded();
- let pool = ThreadPool::builder().pool_size(16).create().unwrap();
+ {
+ let (tx, mut rx) = mpsc::unbounded();
+ let pool = ThreadPool::builder().pool_size(16).create().unwrap();
- let tx = Arc::new(tx);
- let mutex = Arc::new(Mutex::new(0));
+ let tx = Arc::new(tx);
+ let mutex = Arc::new(Mutex::new(0));
- let num_tasks = 1000;
- for _ in 0..num_tasks {
- let tx = tx.clone();
- let mutex = mutex.clone();
- pool.spawn(async move {
- let mut lock = mutex.lock().await;
- ready(()).pending_once().await;
- *lock += 1;
- tx.unbounded_send(()).unwrap();
- drop(lock);
- })
- .unwrap();
- }
-
- block_on(async {
+ let num_tasks = 1000;
for _ in 0..num_tasks {
- rx.next().await.unwrap();
+ let tx = tx.clone();
+ let mutex = mutex.clone();
+ pool.spawn(async move {
+ let mut lock = mutex.lock().await;
+ ready(()).pending_once().await;
+ *lock += 1;
+ tx.unbounded_send(()).unwrap();
+ drop(lock);
+ })
+ .unwrap();
}
- let lock = mutex.lock().await;
- assert_eq!(num_tasks, *lock);
- })
+
+ block_on(async {
+ for _ in 0..num_tasks {
+ rx.next().await.unwrap();
+ }
+ let lock = mutex.lock().await;
+ assert_eq!(num_tasks, *lock);
+ });
+ }
+ std::thread::sleep(std::time::Duration::from_millis(500)); // wait for background threads closed: https://github.com/rust-lang/miri/issues/1371
}