@@ -498,7 +498,7 @@ impl MemoryCellClocks {
498
498
Ok ( ( ) )
499
499
}
500
500
501
- /// Detect data-races with an atomic read, caused by a non-atomic access that does
501
+ /// Detect data-races with an atomic read, caused by a non-atomic write that does
502
502
/// not happen-before the atomic-read.
503
503
fn atomic_read_detect (
504
504
& mut self ,
@@ -509,12 +509,8 @@ impl MemoryCellClocks {
509
509
trace ! ( "Atomic read with vectors: {:#?} :: {:#?}" , self , thread_clocks) ;
510
510
let atomic = self . atomic_access ( thread_clocks, access_size) ?;
511
511
atomic. read_vector . set_at_index ( & thread_clocks. clock , index) ;
512
- // Make sure the last non-atomic write and all non-atomic reads were before this access.
513
- if self . write_was_before ( & thread_clocks. clock ) && self . read <= thread_clocks. clock {
514
- Ok ( ( ) )
515
- } else {
516
- Err ( DataRace )
517
- }
512
+ // Make sure the last non-atomic write was before this access.
513
+ if self . write_was_before ( & thread_clocks. clock ) { Ok ( ( ) ) } else { Err ( DataRace ) }
518
514
}
519
515
520
516
/// Detect data-races with an atomic write, either with a non-atomic read or with
@@ -551,11 +547,9 @@ impl MemoryCellClocks {
551
547
}
552
548
thread_clocks. clock . index_mut ( index) . set_read_type ( read_type) ;
553
549
if self . write_was_before ( & thread_clocks. clock ) {
550
+ // We must be ordered-after all atomic writes.
554
551
let race_free = if let Some ( atomic) = self . atomic ( ) {
555
- // We must be ordered-after all atomic accesses, reads and writes.
556
- // This ensures we don't mix atomic and non-atomic accesses.
557
552
atomic. write_vector <= thread_clocks. clock
558
- && atomic. read_vector <= thread_clocks. clock
559
553
} else {
560
554
true
561
555
} ;
@@ -955,9 +949,7 @@ impl VClockAlloc {
955
949
let mut other_size = None ; // if `Some`, this was a size-mismatch race
956
950
let write_clock;
957
951
let ( other_access, other_thread, other_clock) =
958
- // First check the atomic-nonatomic cases. If it looks like multiple
959
- // cases apply, this one should take precedence, else it might look like
960
- // we are reporting races between two non-atomic reads.
952
+ // First check the atomic-nonatomic cases.
961
953
if !access. is_atomic ( ) &&
962
954
let Some ( atomic) = mem_clocks. atomic ( ) &&
963
955
let Some ( idx) = Self :: find_gt_index ( & atomic. write_vector , & active_clocks. clock )
@@ -1005,10 +997,7 @@ impl VClockAlloc {
1005
997
assert ! ( !involves_non_atomic) ;
1006
998
Some ( "overlapping unsynchronized atomic accesses must use the same access size" )
1007
999
} else if access. is_read ( ) && other_access. is_read ( ) {
1008
- assert ! ( involves_non_atomic) ;
1009
- Some (
1010
- "overlapping atomic and non-atomic accesses must be synchronized, even if both are read-only" ,
1011
- )
1000
+ panic ! ( "there should be no same-size read-read races" )
1012
1001
} else {
1013
1002
None
1014
1003
} ;
0 commit comments