1use crate::cpu::CpuContext;
2use crate::plumbing;
3use std::fmt;
4use std::str;
5use std::str::FromStr;
6
7pub enum ThreadState {
8 Running,
9 Stopped,
10 Waiting,
11 Uninterruptible,
12 Halted,
13}
14
15impl str::FromStr for ThreadState {
16 type Err = String;
17
18 fn from_str(s: &str) -> Result<Self, Self::Err> {
19 match s {
20 "running" => Ok(ThreadState::Running),
21 "stopped" => Ok(ThreadState::Stopped),
22 "waiting" => Ok(ThreadState::Waiting),
23 "uninterruptible" => Ok(ThreadState::Uninterruptible),
24 "halted" => Ok(ThreadState::Halted),
25 _ => Err(format!("'{}' is not a valid value for ThreadState", s)),
26 }
27 }
28}
29
30impl fmt::Display for ThreadState {
31 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
32 let printable = match *self {
33 ThreadState::Running => "Running",
34 ThreadState::Stopped => "Stopped",
35 ThreadState::Waiting => "Waiting",
36 ThreadState::Uninterruptible => "Uninterruptible",
37 ThreadState::Halted => "Halted",
38 };
39 write!(f, "{}", printable)
40 }
41}
42
43pub struct ThreadDetails {
44 pub id: u32,
45 pub state: ThreadState,
46 pub context: CpuContext,
47}
48
49impl From<plumbing::thread::ThreadDetails> for ThreadDetails {
50 fn from(m: plumbing::thread::ThreadDetails) -> Self {
51 ThreadDetails {
52 id: m.id(),
53 state: ThreadState::from_str(&m.state()).unwrap(),
54 context: CpuContext::from(m.context()),
55 }
56 }
57}