os/fs/proc/generators/process/
status.rs1use alloc::{format, sync::Weak, vec::Vec};
2
3use crate::{
4 fs::proc::ContentGenerator,
5 kernel::{TaskState, TaskStruct},
6 sync::SpinLock,
7 vfs::FsError,
8};
9
10pub struct StatusGenerator {
12 task: Weak<SpinLock<TaskStruct>>,
13}
14
15impl StatusGenerator {
16 pub fn new(task: Weak<SpinLock<TaskStruct>>) -> Self {
17 Self { task }
18 }
19}
20
21impl ContentGenerator for StatusGenerator {
22 fn generate(&self) -> Result<Vec<u8>, FsError> {
23 let task_arc = self.task.upgrade().ok_or(FsError::NotFound)?;
24 let task = task_arc.lock();
25
26 let state_char = match task.state {
28 TaskState::Running => 'R',
29 TaskState::Interruptible => 'S',
30 TaskState::Uninterruptible => 'D',
31 TaskState::Stopped => 'T',
32 TaskState::Zombie => 'Z',
33 };
34
35 let name = format!("task_{}", task.tid);
37
38 let content = format!(
40 "Name:\t{}\n\
41 State:\t{} ({})\n\
42 Tgid:\t{}\n\
43 Pid:\t{}\n\
44 PPid:\t{}\n\
45 TracerPid:\t0\n\
46 Uid:\t0\t0\t0\t0\n\
47 Gid:\t0\t0\t0\t0\n",
48 name,
49 state_char,
50 state_name(state_char),
51 task.pid,
52 task.tid,
53 task.ppid,
54 );
55
56 Ok(content.into_bytes())
57 }
58}
59
60fn state_name(state: char) -> &'static str {
61 match state {
62 'R' => "running",
63 'S' => "sleeping",
64 'D' => "disk sleep",
65 'T' => "stopped",
66 'Z' => "zombie",
67 _ => "unknown",
68 }
69}