File tree Expand file tree Collapse file tree 1 file changed +7
-1
lines changed
library/std/src/sys/pal/windows Expand file tree Collapse file tree 1 file changed +7
-1
lines changed Original file line number Diff line number Diff line change @@ -141,9 +141,15 @@ impl StaticKey {
141
141
panic ! ( "out of TLS indexes" ) ;
142
142
}
143
143
144
- self . key . store ( key + 1 , Release ) ;
145
144
register_dtor ( self ) ;
146
145
146
+ // Release-storing the key needs to be the last thing we do.
147
+ // This is because in `fn key()`, other threads will do an acquire load of the key,
148
+ // and if that sees this write then it will entirely bypass the `InitOnce`. We thus
149
+ // need to establish synchronization through `key`. In particular that acquire load
150
+ // must happen-after the register_dtor above, to ensure the dtor actually runs!
151
+ self . key . store ( key + 1 , Release ) ;
152
+
147
153
let r = c:: InitOnceComplete ( self . once . get ( ) , 0 , ptr:: null_mut ( ) ) ;
148
154
debug_assert_eq ! ( r, c:: TRUE ) ;
149
155
You can’t perform that action at this time.
0 commit comments