tokio/runtime/
thread_id.rs

1use 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}