use std::sync::Arc;
use crate::network::transport::NetworkError;
use runar_common::logging::Logger;
use runar_macros_common::log_debug;
use tokio::sync::RwLock;
pub struct StreamPool {
pub idle_streams: RwLock<Vec<quinn::SendStream>>,
pub max_idle_streams: usize,
pub logger: Arc<Logger>,
}
impl StreamPool {
pub fn new(max_idle_streams: usize, logger: Arc<Logger>) -> Self {
Self {
idle_streams: RwLock::new(Vec::with_capacity(max_idle_streams)),
max_idle_streams,
logger,
}
}
pub async fn get_idle_stream(&self) -> Option<quinn::SendStream> {
let mut streams = self.idle_streams.write().await;
streams.pop()
}
pub async fn return_stream(&self, stream: quinn::SendStream) -> Result<(), NetworkError> {
let mut streams = self.idle_streams.write().await;
if streams.len() < self.max_idle_streams {
streams.push(stream);
Ok(())
} else {
log_debug!(self.logger, "Dropping stream: pool is full");
Ok(())
}
}
pub async fn clear(&self) -> Result<(), NetworkError> {
let mut streams = self.idle_streams.write().await;
streams.clear();
Ok(())
}
}
impl std::fmt::Debug for StreamPool {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("StreamPool").finish()
}
}