Auto merge of #2267 - RalfJung:rustup, r=RalfJung
rustup I cannot reproduce https://github.com/rust-lang/rust/issues/98493 so let's see what CI says.
This commit is contained in:
commit
54a495cb27
4 changed files with 61 additions and 50 deletions
|
|
@ -1 +1 @@
|
|||
a09c668c965f735f4cd59e7158662b9daa0b71ba
|
||||
8aab472d52ba7314dc193c73abcd384e2586123c
|
||||
|
|
|
|||
9
tests/pass/concurrency/mutex_leak.rs
Normal file
9
tests/pass/concurrency/mutex_leak.rs
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
// compile-flags: -Zmiri-ignore-leaks
|
||||
use std::mem;
|
||||
use std::sync::Mutex;
|
||||
|
||||
fn main() {
|
||||
// Test for https://github.com/rust-lang/rust/issues/85434
|
||||
let m = Mutex::new(5i32);
|
||||
mem::forget(m.lock());
|
||||
}
|
||||
|
|
@ -35,7 +35,7 @@ fn check_conditional_variables_notify_one() {
|
|||
let pair2 = pair.clone();
|
||||
|
||||
// Spawn a new thread.
|
||||
thread::spawn(move || {
|
||||
let t = thread::spawn(move || {
|
||||
thread::yield_now();
|
||||
let (lock, cvar) = &*pair2;
|
||||
let mut started = lock.lock().unwrap();
|
||||
|
|
@ -50,6 +50,8 @@ fn check_conditional_variables_notify_one() {
|
|||
while !*started {
|
||||
started = cvar.wait(started).unwrap();
|
||||
}
|
||||
|
||||
t.join().unwrap();
|
||||
}
|
||||
|
||||
/// Test that waiting on a conditional variable with a timeout does not
|
||||
|
|
@ -191,51 +193,6 @@ fn check_once() {
|
|||
}
|
||||
}
|
||||
|
||||
fn check_rwlock_unlock_bug1() {
|
||||
// There was a bug where when un-read-locking an rwlock that still has other
|
||||
// readers waiting, we'd accidentally also let a writer in.
|
||||
// That caused an ICE.
|
||||
let l = Arc::new(RwLock::new(0));
|
||||
|
||||
let r1 = l.read().unwrap();
|
||||
let r2 = l.read().unwrap();
|
||||
|
||||
// Make a waiting writer.
|
||||
let l2 = l.clone();
|
||||
thread::spawn(move || {
|
||||
let mut w = l2.write().unwrap();
|
||||
*w += 1;
|
||||
});
|
||||
thread::yield_now();
|
||||
|
||||
drop(r1);
|
||||
assert_eq!(*r2, 0);
|
||||
thread::yield_now();
|
||||
thread::yield_now();
|
||||
thread::yield_now();
|
||||
assert_eq!(*r2, 0);
|
||||
drop(r2);
|
||||
}
|
||||
|
||||
fn check_rwlock_unlock_bug2() {
|
||||
// There was a bug where when un-read-locking an rwlock by letting the last reader leaver,
|
||||
// we'd forget to wake up a writer.
|
||||
// That meant the writer thread could never run again.
|
||||
let l = Arc::new(RwLock::new(0));
|
||||
|
||||
let r = l.read().unwrap();
|
||||
|
||||
// Make a waiting writer.
|
||||
let l2 = l.clone();
|
||||
let h = thread::spawn(move || {
|
||||
let _w = l2.write().unwrap();
|
||||
});
|
||||
thread::yield_now();
|
||||
|
||||
drop(r);
|
||||
h.join().unwrap();
|
||||
}
|
||||
|
||||
fn park_timeout() {
|
||||
let start = Instant::now();
|
||||
|
||||
|
|
@ -277,8 +234,6 @@ fn main() {
|
|||
check_rwlock_write();
|
||||
check_rwlock_read_no_deadlock();
|
||||
check_once();
|
||||
check_rwlock_unlock_bug1();
|
||||
check_rwlock_unlock_bug2();
|
||||
park_timeout();
|
||||
park_unpark();
|
||||
check_condvar();
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
// We are making scheduler assumptions here.
|
||||
// compile-flags: -Zmiri-strict-provenance -Zmiri-preemption-rate=0
|
||||
|
||||
use std::sync::{Arc, Condvar, Mutex};
|
||||
use std::sync::{Arc, Condvar, Mutex, RwLock};
|
||||
use std::thread;
|
||||
|
||||
fn check_conditional_variables_notify_all() {
|
||||
|
|
@ -35,6 +35,53 @@ fn check_conditional_variables_notify_all() {
|
|||
}
|
||||
}
|
||||
|
||||
fn check_rwlock_unlock_bug1() {
|
||||
// There was a bug where when un-read-locking an rwlock that still has other
|
||||
// readers waiting, we'd accidentally also let a writer in.
|
||||
// That caused an ICE.
|
||||
let l = Arc::new(RwLock::new(0));
|
||||
|
||||
let r1 = l.read().unwrap();
|
||||
let r2 = l.read().unwrap();
|
||||
|
||||
// Make a waiting writer.
|
||||
let l2 = l.clone();
|
||||
thread::spawn(move || {
|
||||
let mut w = l2.write().unwrap();
|
||||
*w += 1;
|
||||
});
|
||||
thread::yield_now();
|
||||
|
||||
drop(r1);
|
||||
assert_eq!(*r2, 0);
|
||||
thread::yield_now();
|
||||
thread::yield_now();
|
||||
thread::yield_now();
|
||||
assert_eq!(*r2, 0);
|
||||
drop(r2);
|
||||
}
|
||||
|
||||
fn check_rwlock_unlock_bug2() {
|
||||
// There was a bug where when un-read-locking an rwlock by letting the last reader leaver,
|
||||
// we'd forget to wake up a writer.
|
||||
// That meant the writer thread could never run again.
|
||||
let l = Arc::new(RwLock::new(0));
|
||||
|
||||
let r = l.read().unwrap();
|
||||
|
||||
// Make a waiting writer.
|
||||
let l2 = l.clone();
|
||||
let h = thread::spawn(move || {
|
||||
let _w = l2.write().unwrap();
|
||||
});
|
||||
thread::yield_now();
|
||||
|
||||
drop(r);
|
||||
h.join().unwrap();
|
||||
}
|
||||
|
||||
fn main() {
|
||||
check_conditional_variables_notify_all();
|
||||
check_rwlock_unlock_bug1();
|
||||
check_rwlock_unlock_bug2();
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue