| 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 | |