Skip to content

Commit a3b7839

Browse files
committed
Add comment regarding seq-cst ordering & add test for disabling the data-race detector.
1 parent 4a1f7ac commit a3b7839

File tree

3 files changed

+41
-0
lines changed

3 files changed

+41
-0
lines changed

src/data_race.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,16 @@
2727
//! from acquire/release operations. If weak memory orderings are explored then this
2828
//! may need to change or be updated accordingly.
2929
//!
30+
//! Per the C++ spec for the memory model a sequentially consistent operation:
31+
//! "A load operation with this memory order performs an acquire operation,
32+
//! a store performs a release operation, and read-modify-write performs
33+
//! both an acquire operation and a release operation, plus a single total
34+
//! order exists in which all threads observe all modifications in the same
35+
//! order (see Sequentially-consistent ordering below) "
36+
//! So in the absence of weak memory effects a seq-cst load & a seq-cst store is identical
37+
//! to a acquire load and a release store given the global sequentially consistent order
38+
//! of the schedule.
39+
//!
3040
//! FIXME:
3141
//! currently we have our own local copy of the currently active thread index and names, this is due
3242
//! in part to the inability to access the current location of threads.active_thread inside the AllocExtra
@@ -196,6 +206,7 @@ struct MemoryCellClocks {
196206

197207
/// The vector-clock of the timestamp of the last read operation
198208
/// performed by a thread since the last write operation occured.
209+
/// It is reset to zero on each write operation.
199210
read: VClock,
200211

201212
/// Atomic acquire & release sequence tracking clocks.
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// ignore-windows: Concurrency on Windows is not supported yet.
2+
// compile-flags: -Zmiri-disable-data-race-detector
3+
4+
use std::thread::spawn;
5+
6+
#[derive(Copy, Clone)]
7+
struct EvilSend<T>(pub T);
8+
9+
unsafe impl<T> Send for EvilSend<T> {}
10+
unsafe impl<T> Sync for EvilSend<T> {}
11+
12+
pub fn main() {
13+
let mut a = 0u32;
14+
let b = &mut a as *mut u32;
15+
let c = EvilSend(b);
16+
unsafe {
17+
let j1 = spawn(move || {
18+
*c.0 = 32;
19+
});
20+
21+
let j2 = spawn(move || {
22+
*c.0 = 64; //~ ERROR Data race
23+
});
24+
25+
j1.join().unwrap();
26+
j2.join().unwrap();
27+
}
28+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
warning: thread support is experimental, no weak memory effects are currently emulated.
2+

0 commit comments

Comments
 (0)