We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
1 parent c8d19a9 commit dc5026cCopy full SHA for dc5026c
library/std/src/sys/pal/windows/thread_local_key.rs
@@ -141,9 +141,15 @@ impl StaticKey {
141
panic!("out of TLS indexes");
142
}
143
144
- self.key.store(key + 1, Release);
145
register_dtor(self);
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
+
153
let r = c::InitOnceComplete(self.once.get(), 0, ptr::null_mut());
154
debug_assert_eq!(r, c::TRUE);
155
0 commit comments