strat9_kernel/ipc/
lifecycle.rs1use crate::process::TaskId;
2
3use super::{
4 channel::{self, ChanId},
5 port::{self, PortId},
6 semaphore::{self, SemId},
7 shared_ring::{self, RingId},
8};
9
10#[derive(Debug, Clone, Copy, PartialEq, Eq)]
11pub enum MultiHandleDestroyError {
12 NotFound,
13}
14
15#[derive(Debug, Clone, Copy, PartialEq, Eq)]
18pub enum MultiHandleResource {
19 Channel(ChanId),
20 Semaphore(SemId),
21 SharedRing(RingId),
22 IpcPort { id: PortId, owner: Option<TaskId> },
23}
24
25impl MultiHandleResource {
26 pub fn destroy(self) -> Result<(), MultiHandleDestroyError> {
34 match self {
35 Self::Channel(id) => {
36 channel::destroy_channel(id).map_err(|_| MultiHandleDestroyError::NotFound)
37 }
38 Self::Semaphore(id) => {
39 semaphore::destroy_semaphore(id).map_err(|_| MultiHandleDestroyError::NotFound)
40 }
41 Self::SharedRing(id) => {
42 shared_ring::destroy_ring(id).map_err(|_| MultiHandleDestroyError::NotFound)
43 }
44 Self::IpcPort { id, owner } => {
45 let owner = owner.or_else(|| port::get_port(id).map(|port| port.owner));
46 let task_id = owner.ok_or(MultiHandleDestroyError::NotFound)?;
47 port::destroy_port(id, task_id).map_err(|_| MultiHandleDestroyError::NotFound)
48 }
49 }
50 }
51}