Skip to content

Commit

Permalink
Auto merge of #2267 - RalfJung:rustup, r=RalfJung
Browse files Browse the repository at this point in the history
rustup

I cannot reproduce rust-lang/rust#98493 so let's see what CI says.
  • Loading branch information
bors committed Jun 25, 2022
2 parents e3d42e6 + 1ed43bf commit 793361d
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 50 deletions.
2 changes: 1 addition & 1 deletion rust-version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
a09c668c965f735f4cd59e7158662b9daa0b71ba
8aab472d52ba7314dc193c73abcd384e2586123c
51 changes: 3 additions & 48 deletions tests/pass/concurrency/sync.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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
Expand Down Expand Up @@ -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();

Expand Down Expand Up @@ -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();
Expand Down
49 changes: 48 additions & 1 deletion tests/pass/concurrency/sync_nopreempt.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down Expand Up @@ -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();
}
8 changes: 8 additions & 0 deletions tests/pass/concurrency/sync_singlethread.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
use std::hint;
use std::mem;
use std::sync::atomic;
use std::sync::{Mutex, TryLockError};

fn main() {
test_mutex_stdlib();
leak_mutex_guard();
test_rwlock_stdlib();
test_spin_loop_hint();
test_thread_yield_now();
Expand All @@ -19,6 +21,12 @@ fn test_mutex_stdlib() {
drop(m);
}

fn leak_mutex_guard() {
// Test for https://github.com/rust-lang/rust/issues/85434
let m = Mutex::new(5i32);
mem::forget(m.lock());
}

fn test_rwlock_stdlib() {
use std::sync::RwLock;
let rw = RwLock::new(0);
Expand Down

0 comments on commit 793361d

Please sign in to comment.