1 | use std::fmt; |
2 | use 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)] |
16 | pub struct TaskId(pub(crate) usize); |
17 | |
18 | impl 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 | |
32 | impl fmt::Display for TaskId { |
33 | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
34 | write!(f, " {}" , self.0) |
35 | } |
36 | } |
37 | |