use alloc::{
sync::{Arc, Weak},
vec::Vec,
};
use core::fmt;
use kspin::SpinNoIrq;
use weak_map::WeakMap;
use crate::{Pid, Process, Session};
pub struct ProcessGroup {
pgid: Pid,
pub(crate) session: Arc<Session>,
pub(crate) processes: SpinNoIrq<WeakMap<Pid, Weak<Process>>>,
}
impl ProcessGroup {
pub(crate) fn new(pgid: Pid, session: &Arc<Session>) -> Arc<Self> {
let group = Arc::new(Self {
pgid,
session: session.clone(),
processes: SpinNoIrq::new(WeakMap::new()),
});
session.process_groups.lock().insert(pgid, &group);
group
}
}
impl ProcessGroup {
pub fn pgid(&self) -> Pid {
self.pgid
}
pub fn session(&self) -> Arc<Session> {
self.session.clone()
}
pub fn processes(&self) -> Vec<Arc<Process>> {
self.processes.lock().values().collect()
}
}
impl fmt::Debug for ProcessGroup {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"ProcessGroup({}, session={})",
self.pgid,
self.session.sid()
)
}
}