Skip to main content

lightswitch_metadata/
taskname.rs

1#[derive(Debug, PartialEq, Eq)]
2pub struct TaskName {
3    pub main_thread: String,
4    pub current_thread: String,
5}
6
7impl TaskName {
8    pub fn errored() -> Self {
9        TaskName {
10            main_thread: "<could not fetch process name>".into(),
11            current_thread: "<could not fetch thread name>".into(),
12        }
13    }
14
15    pub fn for_task(task_id: i32) -> Result<TaskName, anyhow::Error> {
16        let task = procfs::process::Process::new(task_id)?;
17        let main_task = procfs::process::Process::new(task.status()?.tgid)?.stat()?;
18        let thread_name = if task.pid == main_task.pid {
19            "<main thread>".to_string()
20        } else {
21            task.stat()?.comm
22        };
23        Ok(TaskName {
24            main_thread: main_task.comm,
25            current_thread: thread_name,
26        })
27    }
28}
29
30#[cfg(test)]
31mod tests {
32    use super::*;
33    use nix::unistd;
34    use std::thread;
35
36    #[test]
37    fn test_thread_name() {
38        let names =
39            TaskName::for_task(unistd::getpgid(Some(unistd::getpid())).unwrap().as_raw()).unwrap();
40        assert_eq!(names.current_thread, "<main thread>");
41
42        let builder = thread::Builder::new().name("funky-thread-name".to_string());
43
44        builder
45            .spawn(|| {
46                let names = TaskName::for_task(unistd::gettid().as_raw()).unwrap();
47                assert_eq!(names.current_thread, "funky-thread-na");
48            })
49            .unwrap()
50            .join()
51            .unwrap();
52    }
53
54    #[test]
55    fn test_errored() {
56        // Given
57        let task_name = TaskName::errored();
58
59        // When / Then
60        assert_eq!(
61            task_name.current_thread,
62            String::from("<could not fetch thread name>")
63        );
64        assert_eq!(
65            task_name.main_thread,
66            String::from("<could not fetch process name>")
67        );
68    }
69}