tokio/runtime/
thread_id.rs1use std::num::NonZeroU64;
2
3#[derive(Eq, PartialEq, Clone, Copy, Hash, Debug)]
4pub(crate) struct ThreadId(NonZeroU64);
5
6impl ThreadId {
7 pub(crate) fn next() -> Self {
8 use crate::loom::sync::atomic::{AtomicU64, Ordering::Relaxed};
9
10 #[cfg(all(test, loom))]
11 crate::loom::lazy_static! {
12 static ref NEXT_ID: AtomicU64 = AtomicU64::new(0);
13 }
14
15 #[cfg(not(all(test, loom)))]
16 static NEXT_ID: AtomicU64 = AtomicU64::new(0);
17
18 let mut last = NEXT_ID.load(Relaxed);
19 loop {
20 let id = match last.checked_add(1) {
21 Some(id) => id,
22 None => exhausted(),
23 };
24
25 match NEXT_ID.compare_exchange_weak(last, id, Relaxed, Relaxed) {
26 Ok(_) => return ThreadId(NonZeroU64::new(id).unwrap()),
27 Err(id) => last = id,
28 }
29 }
30 }
31}
32
33#[cold]
34#[allow(dead_code)]
35fn exhausted() -> ! {
36 panic!("failed to generate unique thread ID: bitspace exhausted")
37}