forked from AbleOS/ableos
52 lines
1 KiB
Rust
52 lines
1 KiB
Rust
|
use core::fmt::Display;
|
||
|
|
||
|
use alloc::collections::VecDeque;
|
||
|
use kernel::proccess::PID;
|
||
|
|
||
|
use crate::{arch::generate_process_pass, handle::Handle};
|
||
|
|
||
|
#[derive(Debug)]
|
||
|
|
||
|
pub struct ChannelPermission {
|
||
|
pub owner: bool,
|
||
|
pub producer: bool,
|
||
|
|
||
|
pub consumer: bool,
|
||
|
/// Whether or not the process can be destructive about reading
|
||
|
pub distructive_consumer: bool,
|
||
|
}
|
||
|
|
||
|
#[derive(Debug)]
|
||
|
pub struct Channel {
|
||
|
inner: VecDeque<u8>,
|
||
|
// TODO(able): change this to a hashmap i think
|
||
|
permission_list: Vec<(PID, ChannelPermission)>,
|
||
|
}
|
||
|
|
||
|
impl Channel {
|
||
|
pub fn new() -> Self {
|
||
|
let deq = VecDeque::from([]);
|
||
|
|
||
|
Self {
|
||
|
inner: deq,
|
||
|
permission_list: vec![],
|
||
|
}
|
||
|
}
|
||
|
|
||
|
pub fn read(&mut self) -> Result<u8, ChannelError> {
|
||
|
if let Some(abc) = self.inner.pop_front() {
|
||
|
return Ok(abc);
|
||
|
}
|
||
|
return Err(ChannelError::EmptyBuffer);
|
||
|
}
|
||
|
|
||
|
pub fn send(&mut self, data: u8) {
|
||
|
self.inner.push_back(data);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
pub enum ChannelError {
|
||
|
EmptyBuffer,
|
||
|
InvalidPermissions,
|
||
|
}
|