1 //! Snapshots of runtime state. 2 //! 3 //! See [Handle::dump][crate::runtime::Handle::dump]. 4 5 use crate::task::Id; 6 use std::fmt; 7 8 /// A snapshot of a runtime's state. 9 /// 10 /// See [Handle::dump][crate::runtime::Handle::dump]. 11 #[derive(Debug)] 12 pub struct Dump { 13 tasks: Tasks, 14 } 15 16 /// Snapshots of tasks. 17 /// 18 /// See [Handle::dump][crate::runtime::Handle::dump]. 19 #[derive(Debug)] 20 pub struct Tasks { 21 tasks: Vec<Task>, 22 } 23 24 /// A snapshot of a task. 25 /// 26 /// See [Handle::dump][crate::runtime::Handle::dump]. 27 #[derive(Debug)] 28 pub struct Task { 29 id: Id, 30 trace: Trace, 31 } 32 33 /// An execution trace of a task's last poll. 34 /// 35 /// See [Handle::dump][crate::runtime::Handle::dump]. 36 #[derive(Debug)] 37 pub struct Trace { 38 inner: super::task::trace::Trace, 39 } 40 41 impl Dump { new(tasks: Vec<Task>) -> Self42 pub(crate) fn new(tasks: Vec<Task>) -> Self { 43 Self { 44 tasks: Tasks { tasks }, 45 } 46 } 47 48 /// Tasks in this snapshot. tasks(&self) -> &Tasks49 pub fn tasks(&self) -> &Tasks { 50 &self.tasks 51 } 52 } 53 54 impl Tasks { 55 /// Iterate over tasks. iter(&self) -> impl Iterator<Item = &Task>56 pub fn iter(&self) -> impl Iterator<Item = &Task> { 57 self.tasks.iter() 58 } 59 } 60 61 impl Task { new(id: Id, trace: super::task::trace::Trace) -> Self62 pub(crate) fn new(id: Id, trace: super::task::trace::Trace) -> Self { 63 Self { 64 id, 65 trace: Trace { inner: trace }, 66 } 67 } 68 69 /// Returns a [task ID] that uniquely identifies this task relative to other 70 /// tasks spawned at the time of the dump. 71 /// 72 /// **Note**: This is an [unstable API][unstable]. The public API of this type 73 /// may break in 1.x releases. See [the documentation on unstable 74 /// features][unstable] for details. 75 /// 76 /// [task ID]: crate::task::Id 77 /// [unstable]: crate#unstable-features 78 #[cfg(tokio_unstable)] 79 #[cfg_attr(docsrs, doc(cfg(tokio_unstable)))] id(&self) -> Id80 pub fn id(&self) -> Id { 81 self.id 82 } 83 84 /// A trace of this task's state. trace(&self) -> &Trace85 pub fn trace(&self) -> &Trace { 86 &self.trace 87 } 88 } 89 90 impl fmt::Display for Trace { fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result91 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 92 self.inner.fmt(f) 93 } 94 } 95