Skip to main content

frida_rs/
thread.rs

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}