std: fix stdout-before-main · qinheping/verify-rust-std@3febfb3 (original) (raw)
`@@ -519,9 +519,14 @@ impl Builder {
`
519
519
``
520
520
`let f = MaybeDangling::new(f);
`
521
521
`let main = move || {
`
522
``
`-
// Immediately store the thread handle to avoid setting it or its ID
`
523
``
`-
// twice, which would cause an abort.
`
524
``
`-
set_current(their_thread.clone());
`
``
522
`+
if let Err(_thread) = set_current(their_thread.clone()) {
`
``
523
`+
// Both the current thread handle and the ID should not be
`
``
524
`+
// initialized yet. Since only the C runtime and some of our
`
``
525
`+
// platform code run before this, this point shouldn't be
`
``
526
`+
// reachable. Use an abort to save binary size (see #123356).
`
``
527
`+
rtabort!("something here is badly broken!");
`
``
528
`+
}
`
``
529
+
525
530
`if let Some(name) = their_thread.cname() {
`
526
531
` imp::Thread::set_name(name);
`
527
532
`}
`
`@@ -1159,9 +1164,6 @@ pub fn park_timeout(dur: Duration) {
`
1159
1164
`pub struct ThreadId(NonZero);
`
1160
1165
``
1161
1166
`impl ThreadId {
`
1162
``
`-
// DO NOT rely on this value.
`
1163
``
`-
const MAIN_THREAD: ThreadId = ThreadId(unsafe { NonZero::new_unchecked(1) });
`
1164
``
-
1165
1167
`// Generate a new unique thread ID.
`
1166
1168
`pub(crate) fn new() -> ThreadId {
`
1167
1169
`#[cold]
`
`@@ -1173,7 +1175,7 @@ impl ThreadId {
`
1173
1175
`if #[cfg(target_has_atomic = "64")] {
`
1174
1176
`use crate::sync::atomic::AtomicU64;
`
1175
1177
``
1176
``
`-
static COUNTER: AtomicU64 = AtomicU64::new(1);
`
``
1178
`+
static COUNTER: AtomicU64 = AtomicU64::new(0);
`
1177
1179
``
1178
1180
`let mut last = COUNTER.load(Ordering::Relaxed);
`
1179
1181
`loop {
`
`@@ -1189,7 +1191,7 @@ impl ThreadId {
`
1189
1191
`} else {
`
1190
1192
`use crate::sync::{Mutex, PoisonError};
`
1191
1193
``
1192
``
`-
static COUNTER: Mutex = Mutex::new(1);
`
``
1194
`+
static COUNTER: Mutex = Mutex::new(0);
`
1193
1195
``
1194
1196
`let mut counter = COUNTER.lock().unwrap_or_else(PoisonError::into_inner);
`
1195
1197
`let Some(id) = counter.checked_add(1) else {
`
`@@ -1326,9 +1328,9 @@ impl Thread {
`
1326
1328
`Self::new_inner(id, ThreadName::Unnamed)
`
1327
1329
`}
`
1328
1330
``
1329
``
`-
// Used in runtime to construct main thread
`
1330
``
`-
pub(crate) fn new_main() -> Thread {
`
1331
``
`-
Self::new_inner(ThreadId::MAIN_THREAD, ThreadName::Main)
`
``
1331
`+
/// Constructs the thread handle for the main thread.
`
``
1332
`+
pub(crate) fn new_main(id: ThreadId) -> Thread {
`
``
1333
`+
Self::new_inner(id, ThreadName::Main)
`
1332
1334
`}
`
1333
1335
``
1334
1336
`fn new_inner(id: ThreadId, name: ThreadName) -> Thread {
`