mirror of
https://github.com/rust-lang/rust.git
synced 2026-04-28 11:17:26 +03:00
b8ae372e48
This removes two minor OnceLock tests which test private methods. The rest of the tests should be more than enough to catch mistakes in those private methods. Also makes ReentrantLock::try_lock public. And finally it makes the mpmc tests actually run.
53 lines
1.1 KiB
Rust
53 lines
1.1 KiB
Rust
use std::cell::RefCell;
|
|
use std::sync::{Arc, ReentrantLock};
|
|
use std::thread;
|
|
|
|
#[test]
|
|
fn smoke() {
|
|
let l = ReentrantLock::new(());
|
|
{
|
|
let a = l.lock();
|
|
{
|
|
let b = l.lock();
|
|
{
|
|
let c = l.lock();
|
|
assert_eq!(*c, ());
|
|
}
|
|
assert_eq!(*b, ());
|
|
}
|
|
assert_eq!(*a, ());
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn is_mutex() {
|
|
let l = Arc::new(ReentrantLock::new(RefCell::new(0)));
|
|
let l2 = l.clone();
|
|
let lock = l.lock();
|
|
let child = thread::spawn(move || {
|
|
let lock = l2.lock();
|
|
assert_eq!(*lock.borrow(), 4950);
|
|
});
|
|
for i in 0..100 {
|
|
let lock = l.lock();
|
|
*lock.borrow_mut() += i;
|
|
}
|
|
drop(lock);
|
|
child.join().unwrap();
|
|
}
|
|
|
|
#[test]
|
|
fn trylock_works() {
|
|
let l = Arc::new(ReentrantLock::new(()));
|
|
let l2 = l.clone();
|
|
let _lock = l.try_lock();
|
|
let _lock2 = l.try_lock();
|
|
thread::spawn(move || {
|
|
let lock = l2.try_lock();
|
|
assert!(lock.is_none());
|
|
})
|
|
.join()
|
|
.unwrap();
|
|
let _lock3 = l.try_lock();
|
|
}
|