starry_process/
process_group.rs

1use 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
12/// A [`ProcessGroup`] is a collection of [`Process`]es.
13pub 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    /// Create a new [`ProcessGroup`] within a [`Session`].
21    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    /// The [`ProcessGroup`] ID.
34    pub fn pgid(&self) -> Pid {
35        self.pgid
36    }
37
38    /// The [`Session`] that the [`ProcessGroup`] belongs to.
39    pub fn session(&self) -> Arc<Session> {
40        self.session.clone()
41    }
42
43    /// The [`Process`]es that belong to this [`ProcessGroup`].
44    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}