lightswitch_metadata/
taskname.rs1#[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 let task_name = TaskName::errored();
58
59 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}