os/fs/proc/generators/process/
stat.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 StatGenerator {
12 task: Weak<SpinLock<TaskStruct>>,
13}
14
15impl StatGenerator {
16 pub fn new(task: Weak<SpinLock<TaskStruct>>) -> Self {
17 Self { task }
18 }
19}
20
21impl ContentGenerator for StatGenerator {
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!(
41 "{} ({}) {} {} {} {} 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n",
42 task.tid, name, state_char, task.ppid, task.pgid, 0, );
50
51 Ok(content.into_bytes())
52 }
53}