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