starry_process/
process_group.rs1use alloc::{
2 sync::{Arc, Weak},
3 vec::Vec,
4};
5use core::fmt;
6
7use kspin::SpinNoIrq;
8use weak_map::WeakMap;
9
10use crate::{Pid, Process, Session};
11
12pub struct ProcessGroup {
14 pgid: Pid,
15 pub(crate) session: Arc<Session>,
16 pub(crate) processes: SpinNoIrq<WeakMap<Pid, Weak<Process>>>,
17}
18
19impl ProcessGroup {
20 pub(crate) fn new(pgid: Pid, session: &Arc<Session>) -> Arc<Self> {
22 let group = Arc::new(Self {
23 pgid,
24 session: session.clone(),
25 processes: SpinNoIrq::new(WeakMap::new()),
26 });
27 session.process_groups.lock().insert(pgid, &group);
28 group
29 }
30}
31
32impl ProcessGroup {
33 pub fn pgid(&self) -> Pid {
35 self.pgid
36 }
37
38 pub fn session(&self) -> Arc<Session> {
40 self.session.clone()
41 }
42
43 pub fn processes(&self) -> Vec<Arc<Process>> {
45 self.processes.lock().values().collect()
46 }
47}
48
49impl fmt::Debug for ProcessGroup {
50 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
51 write!(
52 f,
53 "ProcessGroup({}, session={})",
54 self.pgid,
55 self.session.sid()
56 )
57 }
58}