use crate::network::{NetworkConfig, NetworkError};
use std::collections::BTreeMap;
use std::net::{TcpListener, TcpStream};
use std::sync::{Arc, Mutex};
use std::collections::HashMap;
pub struct EpollManager {
config: NetworkConfig,
connections: Arc<Mutex<HashMap<usize, TcpStream>>>,
connection_count: Arc<Mutex<usize>>,
}
impl EpollManager {
pub fn new(config: NetworkConfig) -> Result<Self, NetworkError> {
Ok(Self {
config,
connections: Arc::new(Mutex::new(HashMap::new())),
connection_count: Arc::new(Mutex::new(0)),
})
}
pub fn add_listener(&mut self, listener: TcpListener) -> Result<(), NetworkError> {
listener.set_nonblocking(true)?;
Ok(())
}
pub fn add_connection(&mut self, conn: TcpStream) -> Result<(), NetworkError> {
conn.set_nonblocking(true)?;
let addr: _ = conn.peer_addr()?;
let conn_id: _ = addr.port() as usize;
let mut connections = self.connections.lock().unwrap();
let mut count = self.connection_count.lock().unwrap();
if connections.len() >= self.config.max_connections {
return Err(NetworkError::ResourceExhausted);
}
connections.insert(conn_id, conn);
*count += 1;
Ok(())
}
pub fn connection_count(&self) -> usize {
*self.connection_count.lock().unwrap()
}
}