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!(
136
136
// we only ever read from the tid if `tls_addr` matches the current
137
137
// TLS address. In that case, either the tid has been set by
138
138
// 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
140
140
// synchronization is needed (as per <https://github.com/rust-lang/miri/issues/3450>)
141
141
tls_addr: Atomic <usize >,
142
142
tid: UnsafeCell <u64 >,
@@ -154,8 +154,12 @@ cfg_if!(
154
154
// NOTE: This assumes that `owner` is the ID of the current
155
155
// thread, and may spuriously return `false` if that's not the case.
156
156
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( ) ;
157
161
// 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
159
163
&& unsafe { * self . tid. get( ) } == owner. as_u64( ) . get( )
160
164
}
161
165
You can’t perform that action at this time.
0 commit comments