asterinas/kernel/src/net/socket/netlink/receiver.rs

50 lines
1.3 KiB
Rust

// SPDX-License-Identifier: MPL-2.0
use crate::{events::IoEvents, prelude::*, process::signal::Pollee};
pub struct MessageReceiver<Message> {
message_queue: Arc<Mutex<MessageQueue<Message>>>,
pollee: Pollee,
}
pub(super) struct MessageQueue<Message>(VecDeque<Message>);
impl<Message> MessageQueue<Message> {
pub(super) fn new_pair(pollee: Pollee) -> (Arc<Mutex<Self>>, MessageReceiver<Message>) {
let queue = Arc::new(Mutex::new(Self(VecDeque::new())));
let receiver = MessageReceiver {
message_queue: queue.clone(),
pollee,
};
(queue, receiver)
}
pub(super) fn is_empty(&self) -> bool {
self.0.is_empty()
}
pub(super) fn peek(&self) -> Option<&Message> {
self.0.front()
}
pub(super) fn dequeue(&mut self) -> Option<Message> {
self.0.pop_front()
}
pub(self) fn enqueue(&mut self, message: Message) -> Result<()> {
// FIXME: We should verify the socket buffer length to ensure
// that adding the message doesn't exceed the buffer capacity.
self.0.push_back(message);
Ok(())
}
}
impl<Message> MessageReceiver<Message> {
pub(super) fn enqueue_message(&self, message: Message) -> Result<()> {
self.message_queue.lock().enqueue(message)?;
self.pollee.notify(IoEvents::IN);
Ok(())
}
}