arc_malachitebft_engine/util/
msg_buffer.rs1use std::collections::VecDeque;
2
3use malachitebft_core_types::Context;
4use tracing::{info, warn};
5
6use crate::consensus::ConsensusMsg;
7
8pub struct MessageBuffer<Ctx: Context> {
9 messages: VecDeque<ConsensusMsg<Ctx>>,
10 max_size: usize,
11}
12
13impl<Ctx: Context> MessageBuffer<Ctx> {
14 pub fn new(max_size: usize) -> Self {
15 Self {
16 messages: VecDeque::new(),
17 max_size,
18 }
19 }
20
21 pub fn buffer(&mut self, msg: ConsensusMsg<Ctx>) -> bool {
22 if self.messages.len() < self.max_size {
23 info!("Buffering message: {msg:?}");
24 self.messages.push_back(msg);
25 true
26 } else {
27 warn!("Buffer is full, dropping message: {msg:?}");
28 false
29 }
30 }
31
32 pub fn pop(&mut self) -> Option<ConsensusMsg<Ctx>> {
33 self.messages.pop_front()
34 }
35
36 pub fn is_empty(&self) -> bool {
37 self.messages.is_empty()
38 }
39
40 pub fn len(&self) -> usize {
41 self.messages.len()
42 }
43}