async_std/task/
task_id.rs

1use std::fmt;
2use std::sync::atomic::{AtomicUsize, Ordering};
3
4/// A unique identifier for a task.
5///
6/// # Examples
7///
8/// ```
9/// use async_std::task;
10///
11/// task::block_on(async {
12///     println!("id = {:?}", task::current().id());
13/// })
14/// ```
15#[derive(Eq, PartialEq, Clone, Copy, Hash, Debug)]
16pub struct TaskId(pub(crate) usize);
17
18impl TaskId {
19    /// Generates a new `TaskId`.
20    pub(crate) fn generate() -> TaskId {
21        // TODO: find a good version to emulate u64 atomics on 32 bit systems.
22        static COUNTER: AtomicUsize = AtomicUsize::new(1);
23
24        let id = COUNTER.fetch_add(1, Ordering::Relaxed);
25        if id > usize::max_value() / 2 {
26            std::process::abort();
27        }
28        TaskId(id)
29    }
30}
31
32impl fmt::Display for TaskId {
33    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
34        write!(f, "{}", self.0)
35    }
36}