@@ -847,6 +847,7 @@ impl VClockAlloc {
847847 kind : MemoryKind ,
848848 current_span : Span ,
849849 ) -> VClockAlloc {
850+ // Determine the thread that did the allocation, and when it did it.
850851 let ( alloc_timestamp, alloc_index) = match kind {
851852 // User allocated and stack memory should track allocation.
852853 MemoryKind :: Machine (
@@ -858,21 +859,22 @@ impl VClockAlloc {
858859 | MiriMemoryKind :: Mmap ,
859860 )
860861 | MemoryKind :: Stack => {
861- let ( alloc_index, clocks) = global. current_thread_state ( thread_mgr) ;
862+ let ( alloc_index, clocks) = global. active_thread_state ( thread_mgr) ;
862863 let mut alloc_timestamp = clocks. clock [ alloc_index] ;
863864 alloc_timestamp. span = current_span;
864865 ( alloc_timestamp, alloc_index)
865866 }
866867 // Other global memory should trace races but be allocated at the 0 timestamp
867- // (conceptually they are allocated before everything).
868+ // (conceptually they are allocated on the main thread before everything).
868869 MemoryKind :: Machine (
869870 MiriMemoryKind :: Global
870871 | MiriMemoryKind :: Machine
871872 | MiriMemoryKind :: Runtime
872873 | MiriMemoryKind :: ExternStatic
873874 | MiriMemoryKind :: Tls ,
874875 )
875- | MemoryKind :: CallerLocation => ( VTimestamp :: ZERO , VectorIdx :: MAX_INDEX ) ,
876+ | MemoryKind :: CallerLocation =>
877+ ( VTimestamp :: ZERO , global. thread_index ( ThreadId :: MAIN_THREAD ) ) ,
876878 } ;
877879 VClockAlloc {
878880 alloc_ranges : RefCell :: new ( RangeMap :: new (
@@ -930,7 +932,7 @@ impl VClockAlloc {
930932 ptr_dbg : Pointer < AllocId > ,
931933 ty : Option < Ty < ' _ > > ,
932934 ) -> InterpResult < ' tcx > {
933- let ( current_index , current_clocks ) = global. current_thread_state ( thread_mgr) ;
935+ let ( active_index , active_clocks ) = global. active_thread_state ( thread_mgr) ;
934936 let mut other_size = None ; // if `Some`, this was a size-mismatch race
935937 let write_clock;
936938 let ( other_access, other_thread, other_clock) =
@@ -939,30 +941,30 @@ impl VClockAlloc {
939941 // we are reporting races between two non-atomic reads.
940942 if !access. is_atomic ( ) &&
941943 let Some ( atomic) = mem_clocks. atomic ( ) &&
942- let Some ( idx) = Self :: find_gt_index ( & atomic. write_vector , & current_clocks . clock )
944+ let Some ( idx) = Self :: find_gt_index ( & atomic. write_vector , & active_clocks . clock )
943945 {
944946 ( AccessType :: AtomicStore , idx, & atomic. write_vector )
945947 } else if !access. is_atomic ( ) &&
946948 let Some ( atomic) = mem_clocks. atomic ( ) &&
947- let Some ( idx) = Self :: find_gt_index ( & atomic. read_vector , & current_clocks . clock )
949+ let Some ( idx) = Self :: find_gt_index ( & atomic. read_vector , & active_clocks . clock )
948950 {
949951 ( AccessType :: AtomicLoad , idx, & atomic. read_vector )
950952 // Then check races with non-atomic writes/reads.
951- } else if mem_clocks. write . 1 > current_clocks . clock [ mem_clocks. write . 0 ] {
953+ } else if mem_clocks. write . 1 > active_clocks . clock [ mem_clocks. write . 0 ] {
952954 write_clock = mem_clocks. write ( ) ;
953955 ( AccessType :: NaWrite ( mem_clocks. write_type ) , mem_clocks. write . 0 , & write_clock)
954- } else if let Some ( idx) = Self :: find_gt_index ( & mem_clocks. read , & current_clocks . clock ) {
956+ } else if let Some ( idx) = Self :: find_gt_index ( & mem_clocks. read , & active_clocks . clock ) {
955957 ( AccessType :: NaRead ( mem_clocks. read [ idx] . read_type ( ) ) , idx, & mem_clocks. read )
956958 // Finally, mixed-size races.
957959 } else if access. is_atomic ( ) && let Some ( atomic) = mem_clocks. atomic ( ) && atomic. size != access_size {
958960 // This is only a race if we are not synchronized with all atomic accesses, so find
959961 // the one we are not synchronized with.
960962 other_size = Some ( atomic. size ) ;
961- if let Some ( idx) = Self :: find_gt_index ( & atomic. write_vector , & current_clocks . clock )
963+ if let Some ( idx) = Self :: find_gt_index ( & atomic. write_vector , & active_clocks . clock )
962964 {
963965 ( AccessType :: AtomicStore , idx, & atomic. write_vector )
964966 } else if let Some ( idx) =
965- Self :: find_gt_index ( & atomic. read_vector , & current_clocks . clock )
967+ Self :: find_gt_index ( & atomic. read_vector , & active_clocks . clock )
966968 {
967969 ( AccessType :: AtomicLoad , idx, & atomic. read_vector )
968970 } else {
@@ -975,7 +977,7 @@ impl VClockAlloc {
975977 } ;
976978
977979 // Load elaborated thread information about the racing thread actions.
978- let current_thread_info = global. print_thread_metadata ( thread_mgr, current_index ) ;
980+ let active_thread_info = global. print_thread_metadata ( thread_mgr, active_index ) ;
979981 let other_thread_info = global. print_thread_metadata ( thread_mgr, other_thread) ;
980982 let involves_non_atomic = !access. is_atomic ( ) || !other_access. is_atomic ( ) ;
981983
@@ -1003,8 +1005,8 @@ impl VClockAlloc {
10031005 } ,
10041006 op2: RacingOp {
10051007 action: access. description( ty, other_size. map( |_| access_size) ) ,
1006- thread_info: current_thread_info ,
1007- span: current_clocks . clock. as_slice( ) [ current_index . index( ) ] . span_data( ) ,
1008+ thread_info: active_thread_info ,
1009+ span: active_clocks . clock. as_slice( ) [ active_index . index( ) ] . span_data( ) ,
10081010 } ,
10091011 } ) ) ?
10101012 }
@@ -1026,7 +1028,7 @@ impl VClockAlloc {
10261028 let current_span = machine. current_span ( ) ;
10271029 let global = machine. data_race . as_ref ( ) . unwrap ( ) ;
10281030 if global. race_detecting ( ) {
1029- let ( index, mut thread_clocks) = global. current_thread_state_mut ( & machine. threads ) ;
1031+ let ( index, mut thread_clocks) = global. active_thread_state_mut ( & machine. threads ) ;
10301032 let mut alloc_ranges = self . alloc_ranges . borrow_mut ( ) ;
10311033 for ( mem_clocks_range, mem_clocks) in
10321034 alloc_ranges. iter_mut ( access_range. start , access_range. size )
@@ -1069,7 +1071,7 @@ impl VClockAlloc {
10691071 let current_span = machine. current_span ( ) ;
10701072 let global = machine. data_race . as_mut ( ) . unwrap ( ) ;
10711073 if global. race_detecting ( ) {
1072- let ( index, mut thread_clocks) = global. current_thread_state_mut ( & machine. threads ) ;
1074+ let ( index, mut thread_clocks) = global. active_thread_state_mut ( & machine. threads ) ;
10731075 for ( mem_clocks_range, mem_clocks) in
10741076 self . alloc_ranges . get_mut ( ) . iter_mut ( access_range. start , access_range. size )
10751077 {
@@ -1454,7 +1456,7 @@ impl GlobalState {
14541456 // Setup the main-thread since it is not explicitly created:
14551457 // uses vector index and thread-id 0.
14561458 let index = global_state. vector_clocks . get_mut ( ) . push ( ThreadClockSet :: default ( ) ) ;
1457- global_state. vector_info . get_mut ( ) . push ( ThreadId :: new ( 0 ) ) ;
1459+ global_state. vector_info . get_mut ( ) . push ( ThreadId :: MAIN_THREAD ) ;
14581460 global_state
14591461 . thread_info
14601462 . get_mut ( )
@@ -1518,7 +1520,7 @@ impl GlobalState {
15181520 thread : ThreadId ,
15191521 current_span : Span ,
15201522 ) {
1521- let current_index = self . current_index ( thread_mgr) ;
1523+ let current_index = self . active_thread_index ( thread_mgr) ;
15221524
15231525 // Enable multi-threaded execution, there are now at least two threads
15241526 // so data-races are now possible.
@@ -1642,7 +1644,7 @@ impl GlobalState {
16421644 /// `thread_joined`.
16431645 #[ inline]
16441646 pub fn thread_terminated ( & mut self , thread_mgr : & ThreadManager < ' _ , ' _ > , current_span : Span ) {
1645- let current_index = self . current_index ( thread_mgr) ;
1647+ let current_index = self . active_thread_index ( thread_mgr) ;
16461648
16471649 // Increment the clock to a unique termination timestamp.
16481650 let vector_clocks = self . vector_clocks . get_mut ( ) ;
@@ -1680,9 +1682,9 @@ impl GlobalState {
16801682 op : impl FnOnce ( VectorIdx , RefMut < ' _ , ThreadClockSet > ) -> InterpResult < ' tcx , bool > ,
16811683 ) -> InterpResult < ' tcx > {
16821684 if self . multi_threaded . get ( ) {
1683- let ( index, clocks) = self . current_thread_state_mut ( thread_mgr) ;
1685+ let ( index, clocks) = self . active_thread_state_mut ( thread_mgr) ;
16841686 if op ( index, clocks) ? {
1685- let ( _, mut clocks) = self . current_thread_state_mut ( thread_mgr) ;
1687+ let ( _, mut clocks) = self . active_thread_state_mut ( thread_mgr) ;
16861688 clocks. increment_clock ( index, current_span) ;
16871689 }
16881690 }
@@ -1725,13 +1727,15 @@ impl GlobalState {
17251727 Ref :: map ( clocks, |c| & c. clock )
17261728 }
17271729
1730+ fn thread_index ( & self , thread : ThreadId ) -> VectorIdx {
1731+ self . thread_info . borrow ( ) [ thread] . vector_index . expect ( "thread has no assigned vector" )
1732+ }
1733+
17281734 /// Load the vector index used by the given thread as well as the set of vector clocks
17291735 /// used by the thread.
17301736 #[ inline]
17311737 fn thread_state_mut ( & self , thread : ThreadId ) -> ( VectorIdx , RefMut < ' _ , ThreadClockSet > ) {
1732- let index = self . thread_info . borrow ( ) [ thread]
1733- . vector_index
1734- . expect ( "Loading thread state for thread with no assigned vector" ) ;
1738+ let index = self . thread_index ( thread) ;
17351739 let ref_vector = self . vector_clocks . borrow_mut ( ) ;
17361740 let clocks = RefMut :: map ( ref_vector, |vec| & mut vec[ index] ) ;
17371741 ( index, clocks)
@@ -1741,9 +1745,7 @@ impl GlobalState {
17411745 /// used by the thread.
17421746 #[ inline]
17431747 fn thread_state ( & self , thread : ThreadId ) -> ( VectorIdx , Ref < ' _ , ThreadClockSet > ) {
1744- let index = self . thread_info . borrow ( ) [ thread]
1745- . vector_index
1746- . expect ( "Loading thread state for thread with no assigned vector" ) ;
1748+ let index = self . thread_index ( thread) ;
17471749 let ref_vector = self . vector_clocks . borrow ( ) ;
17481750 let clocks = Ref :: map ( ref_vector, |vec| & vec[ index] ) ;
17491751 ( index, clocks)
@@ -1752,7 +1754,7 @@ impl GlobalState {
17521754 /// Load the current vector clock in use and the current set of thread clocks
17531755 /// in use for the vector.
17541756 #[ inline]
1755- pub ( super ) fn current_thread_state (
1757+ pub ( super ) fn active_thread_state (
17561758 & self ,
17571759 thread_mgr : & ThreadManager < ' _ , ' _ > ,
17581760 ) -> ( VectorIdx , Ref < ' _ , ThreadClockSet > ) {
@@ -1762,7 +1764,7 @@ impl GlobalState {
17621764 /// Load the current vector clock in use and the current set of thread clocks
17631765 /// in use for the vector mutably for modification.
17641766 #[ inline]
1765- pub ( super ) fn current_thread_state_mut (
1767+ pub ( super ) fn active_thread_state_mut (
17661768 & self ,
17671769 thread_mgr : & ThreadManager < ' _ , ' _ > ,
17681770 ) -> ( VectorIdx , RefMut < ' _ , ThreadClockSet > ) {
@@ -1772,22 +1774,20 @@ impl GlobalState {
17721774 /// Return the current thread, should be the same
17731775 /// as the data-race active thread.
17741776 #[ inline]
1775- fn current_index ( & self , thread_mgr : & ThreadManager < ' _ , ' _ > ) -> VectorIdx {
1777+ fn active_thread_index ( & self , thread_mgr : & ThreadManager < ' _ , ' _ > ) -> VectorIdx {
17761778 let active_thread_id = thread_mgr. get_active_thread_id ( ) ;
1777- self . thread_info . borrow ( ) [ active_thread_id]
1778- . vector_index
1779- . expect ( "active thread has no assigned vector" )
1779+ self . thread_index ( active_thread_id)
17801780 }
17811781
17821782 // SC ATOMIC STORE rule in the paper.
17831783 pub ( super ) fn sc_write ( & self , thread_mgr : & ThreadManager < ' _ , ' _ > ) {
1784- let ( index, clocks) = self . current_thread_state ( thread_mgr) ;
1784+ let ( index, clocks) = self . active_thread_state ( thread_mgr) ;
17851785 self . last_sc_write . borrow_mut ( ) . set_at_index ( & clocks. clock , index) ;
17861786 }
17871787
17881788 // SC ATOMIC READ rule in the paper.
17891789 pub ( super ) fn sc_read ( & self , thread_mgr : & ThreadManager < ' _ , ' _ > ) {
1790- let ( .., mut clocks) = self . current_thread_state_mut ( thread_mgr) ;
1790+ let ( .., mut clocks) = self . active_thread_state_mut ( thread_mgr) ;
17911791 clocks. read_seqcst . join ( & self . last_sc_fence . borrow ( ) ) ;
17921792 }
17931793}
0 commit comments