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: usize = COUNTER.fetch_add(val:1, order: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}
37