From 95a4a8d75d17da9adbcaf3b00cbede3ac3a0ec45 Mon Sep 17 00:00:00 2001 From: Emi Tatsuo Date: Sun, 22 Nov 2020 11:55:33 -0500 Subject: [PATCH] Reduce number of required `Arc`s Should improve performance because cloning an `Arc` is expensive --- src/lib.rs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 86bfab4..95d3425 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -36,13 +36,12 @@ pub use types::*; pub const REQUEST_URI_MAX_LEN: usize = 1024; pub const GEMINI_PORT: u16 = 1965; -type Handler = Arc HandlerResponse + Send + Sync>; +type Handler = Box HandlerResponse + Send + Sync>; pub (crate) type HandlerResponse = Pin> + Send>>; #[derive(Clone)] pub struct Server { tls_acceptor: TlsAcceptor, - listener: Arc, routes: Arc>, timeout: Duration, complex_timeout: Option, @@ -53,9 +52,9 @@ impl Server { Builder::bind(addr) } - async fn serve(self) -> Result<()> { + async fn serve(self, listener: TcpListener) -> Result<()> { loop { - let (stream, _addr) = self.listener.accept().await + let (stream, _addr) = listener.accept().await .context("Failed to accept client")?; let this = self.clone(); @@ -298,7 +297,7 @@ impl Builder { H: Send + Sync + 'static + Fn(Request) -> F, F: Send + Sync + 'static + Future> { - let wrapped = Arc::new(move|req| Box::pin((handler)(req)) as HandlerResponse); + let wrapped = Box::new(move|req| Box::pin((handler)(req)) as HandlerResponse); self.routes.add_route(path, wrapped); self } @@ -314,13 +313,12 @@ impl Builder { let server = Server { tls_acceptor: TlsAcceptor::from(config), - listener: Arc::new(listener), routes: Arc::new(self.routes), timeout: self.timeout, complex_timeout: self.complex_body_timeout_override, }; - server.serve().await + server.serve(listener).await } }