File tree Expand file tree Collapse file tree 1 file changed +6
-2
lines changed Expand file tree Collapse file tree 1 file changed +6
-2
lines changed Original file line number Diff line number Diff line change @@ -136,7 +136,7 @@ cfg_if!(
136136 // we only ever read from the tid if `tls_addr` matches the current
137137 // TLS address. In that case, either the tid has been set by
138138 // the current thread, or by a thread that has terminated before
139- // the current thread was created . In either case, no further
139+ // the current thread's `tls_addr` was allocated . In either case, no further
140140 // synchronization is needed (as per <https://github.com/rust-lang/miri/issues/3450>)
141141 tls_addr: Atomic <usize >,
142142 tid: UnsafeCell <u64 >,
@@ -154,8 +154,12 @@ cfg_if!(
154154 // NOTE: This assumes that `owner` is the ID of the current
155155 // thread, and may spuriously return `false` if that's not the case.
156156 fn contains( & self , owner: ThreadId ) -> bool {
157+ // We must call `tls_addr()` *before* doing the load to ensure that if we reuse an
158+ // earlier thread's address, the `tls_addr.load()` below happens-after everything
159+ // that thread did.
160+ let tls_addr = tls_addr( ) ;
157161 // SAFETY: See the comments in the struct definition.
158- self . tls_addr. load( Ordering :: Relaxed ) == tls_addr( )
162+ self . tls_addr. load( Ordering :: Relaxed ) == tls_addr
159163 && unsafe { * self . tid. get( ) } == owner. as_u64( ) . get( )
160164 }
161165
You can’t perform that action at this time.
0 commit comments