ableos/kernel/src/ipc/buffer.rs

73 lines
1.9 KiB
Rust
Raw Normal View History

2023-06-13 06:00:11 -05:00
//!
2023-05-15 02:19:34 -05:00
2023-06-13 06:00:11 -05:00
use {
2024-03-22 05:13:17 -05:00
super::{message::Message, protocol::Protocol},
2023-06-13 06:00:11 -05:00
crossbeam_queue::{ArrayQueue, SegQueue},
};
pub enum BufferTypes {
2023-05-15 02:19:34 -05:00
Unbound(SegQueue<Message>),
Bound(ArrayQueue<Message>),
}
2023-06-13 06:00:11 -05:00
/// Interproccess buffer
2024-09-13 16:41:31 -05:00
pub struct IpcBuffer<'a> {
pub protocol: Protocol<'a>,
pub buffer: BufferTypes,
2023-05-15 02:19:34 -05:00
}
2024-09-13 16:41:31 -05:00
impl<'a> IpcBuffer<'a> {
2023-09-09 02:35:16 -05:00
pub fn new(bounded: bool, length: u64) -> Self {
log::debug!(
"New IPCBuffer\r
bounded: {}\r
length: {:?}\r",
bounded,
length
);
match (bounded, length) {
2024-09-13 16:41:31 -05:00
(false, ..) => {
2023-09-09 02:35:16 -05:00
let buftype = BufferTypes::Unbound(SegQueue::new());
Self {
2024-03-22 05:13:17 -05:00
protocol: Protocol::void(),
2023-09-09 02:35:16 -05:00
buffer: buftype,
}
}
(true, length) => {
let buftype = BufferTypes::Bound(ArrayQueue::new(length as usize));
Self {
2024-03-22 05:13:17 -05:00
protocol: Protocol::void(),
2023-09-09 02:35:16 -05:00
buffer: buftype,
}
}
}
}
2023-06-13 06:00:11 -05:00
/// Validate a message to match the `IPC.protocol`
pub fn validate_messages(&mut self) -> Result<(), IpcError> {
Ok(())
}
pub fn push(&mut self, msg: Message) {
match &self.buffer {
2024-09-13 16:41:31 -05:00
BufferTypes::Unbound(buff) => buff.push(msg),
BufferTypes::Bound(buff) => buff.push(msg).unwrap(),
};
}
2024-08-19 13:13:58 -05:00
pub fn pop(&mut self) -> Result<Message, IpcError> {
let msg = match &self.buffer {
BufferTypes::Unbound(buff) => buff.pop(),
BufferTypes::Bound(buff) => buff.pop(),
};
match msg {
2024-08-19 13:13:58 -05:00
Some(msg) => return Ok(msg),
None => return Err(IpcError::NoMessagesInBuffer),
}
}
}
2023-06-13 06:00:11 -05:00
/// Interprocess Communication Errors
2024-08-19 13:13:58 -05:00
#[derive(Debug)]
pub enum IpcError {
2023-06-13 06:00:11 -05:00
/// An invalid message error returned to the sender
InvalidMessage,
2024-08-19 13:13:58 -05:00
NoMessagesInBuffer,
}