@@ -499,7 +499,7 @@ impl MemoryCellClocks {
499499 Ok ( ( ) )
500500 }
501501
502- /// Detect data-races with an atomic read, caused by a non-atomic access that does
502+ /// Detect data-races with an atomic read, caused by a non-atomic write that does
503503 /// not happen-before the atomic-read.
504504 fn atomic_read_detect (
505505 & mut self ,
@@ -510,12 +510,8 @@ impl MemoryCellClocks {
510510 trace ! ( "Atomic read with vectors: {:#?} :: {:#?}" , self , thread_clocks) ;
511511 let atomic = self . atomic_access ( thread_clocks, access_size) ?;
512512 atomic. read_vector . set_at_index ( & thread_clocks. clock , index) ;
513- // Make sure the last non-atomic write and all non-atomic reads were before this access.
514- if self . write_was_before ( & thread_clocks. clock ) && self . read <= thread_clocks. clock {
515- Ok ( ( ) )
516- } else {
517- Err ( DataRace )
518- }
513+ // Make sure the last non-atomic write was before this access.
514+ if self . write_was_before ( & thread_clocks. clock ) { Ok ( ( ) ) } else { Err ( DataRace ) }
519515 }
520516
521517 /// Detect data-races with an atomic write, either with a non-atomic read or with
@@ -552,11 +548,9 @@ impl MemoryCellClocks {
552548 }
553549 thread_clocks. clock . index_mut ( index) . set_read_type ( read_type) ;
554550 if self . write_was_before ( & thread_clocks. clock ) {
551+ // We must be ordered-after all atomic writes.
555552 let race_free = if let Some ( atomic) = self . atomic ( ) {
556- // We must be ordered-after all atomic accesses, reads and writes.
557- // This ensures we don't mix atomic and non-atomic accesses.
558553 atomic. write_vector <= thread_clocks. clock
559- && atomic. read_vector <= thread_clocks. clock
560554 } else {
561555 true
562556 } ;
@@ -957,9 +951,7 @@ impl VClockAlloc {
957951 let mut other_size = None ; // if `Some`, this was a size-mismatch race
958952 let write_clock;
959953 let ( other_access, other_thread, other_clock) =
960- // First check the atomic-nonatomic cases. If it looks like multiple
961- // cases apply, this one should take precedence, else it might look like
962- // we are reporting races between two non-atomic reads.
954+ // First check the atomic-nonatomic cases.
963955 if !access. is_atomic ( ) &&
964956 let Some ( atomic) = mem_clocks. atomic ( ) &&
965957 let Some ( idx) = Self :: find_gt_index ( & atomic. write_vector , & active_clocks. clock )
@@ -1007,10 +999,7 @@ impl VClockAlloc {
1007999 assert ! ( !involves_non_atomic) ;
10081000 Some ( "overlapping unsynchronized atomic accesses must use the same access size" )
10091001 } else if access. is_read ( ) && other_access. is_read ( ) {
1010- assert ! ( involves_non_atomic) ;
1011- Some (
1012- "overlapping atomic and non-atomic accesses must be synchronized, even if both are read-only" ,
1013- )
1002+ panic ! ( "there should be no same-size read-read races" )
10141003 } else {
10151004 None
10161005 } ;
0 commit comments