xref: /webrtc/util/src/vnet/chunk_queue.rs (revision ffe74184)
1*ffe74184SMartin Algesten #[cfg(test)]
2*ffe74184SMartin Algesten mod chunk_queue_test;
3*ffe74184SMartin Algesten 
4*ffe74184SMartin Algesten use super::chunk::*;
5*ffe74184SMartin Algesten 
6*ffe74184SMartin Algesten use std::collections::VecDeque;
7*ffe74184SMartin Algesten use tokio::sync::RwLock;
8*ffe74184SMartin Algesten 
9*ffe74184SMartin Algesten #[derive(Default)]
10*ffe74184SMartin Algesten pub(crate) struct ChunkQueue {
11*ffe74184SMartin Algesten     chunks: RwLock<VecDeque<Box<dyn Chunk + Send + Sync>>>,
12*ffe74184SMartin Algesten     max_size: usize, // 0 or negative value: unlimited
13*ffe74184SMartin Algesten }
14*ffe74184SMartin Algesten 
15*ffe74184SMartin Algesten impl ChunkQueue {
new(max_size: usize) -> Self16*ffe74184SMartin Algesten     pub(crate) fn new(max_size: usize) -> Self {
17*ffe74184SMartin Algesten         ChunkQueue {
18*ffe74184SMartin Algesten             chunks: RwLock::new(VecDeque::new()),
19*ffe74184SMartin Algesten             max_size,
20*ffe74184SMartin Algesten         }
21*ffe74184SMartin Algesten     }
22*ffe74184SMartin Algesten 
push(&self, c: Box<dyn Chunk + Send + Sync>) -> bool23*ffe74184SMartin Algesten     pub(crate) async fn push(&self, c: Box<dyn Chunk + Send + Sync>) -> bool {
24*ffe74184SMartin Algesten         let mut chunks = self.chunks.write().await;
25*ffe74184SMartin Algesten 
26*ffe74184SMartin Algesten         if self.max_size > 0 && chunks.len() >= self.max_size {
27*ffe74184SMartin Algesten             false // dropped
28*ffe74184SMartin Algesten         } else {
29*ffe74184SMartin Algesten             chunks.push_back(c);
30*ffe74184SMartin Algesten             true
31*ffe74184SMartin Algesten         }
32*ffe74184SMartin Algesten     }
33*ffe74184SMartin Algesten 
pop(&self) -> Option<Box<dyn Chunk + Send + Sync>>34*ffe74184SMartin Algesten     pub(crate) async fn pop(&self) -> Option<Box<dyn Chunk + Send + Sync>> {
35*ffe74184SMartin Algesten         let mut chunks = self.chunks.write().await;
36*ffe74184SMartin Algesten         chunks.pop_front()
37*ffe74184SMartin Algesten     }
38*ffe74184SMartin Algesten 
peek(&self) -> Option<Box<dyn Chunk + Send + Sync>>39*ffe74184SMartin Algesten     pub(crate) async fn peek(&self) -> Option<Box<dyn Chunk + Send + Sync>> {
40*ffe74184SMartin Algesten         let chunks = self.chunks.read().await;
41*ffe74184SMartin Algesten         chunks.front().map(|chunk| chunk.clone_to())
42*ffe74184SMartin Algesten     }
43*ffe74184SMartin Algesten }
44