From d23623317820696c910ce43262d5276e8e24c066 Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Fri, 7 Apr 2017 19:48:37 -0700 Subject: [PATCH] fix(server): don't dup the listener TCP socket. This both avoids a possible source of panics and also avoids eating a file descriptor for each worker thread. When running with a lot of those, this can start eating up quite a lot of the process's file descriptor quota. --- src/net.rs | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/src/net.rs b/src/net.rs index b4f9ecf6e9..5e8c7f532a 100644 --- a/src/net.rs +++ b/src/net.rs @@ -4,6 +4,7 @@ use std::fmt; use std::io::{self, ErrorKind, Read, Write}; use std::net::{SocketAddr, ToSocketAddrs, TcpStream, TcpListener, Shutdown}; use std::mem; +use std::sync::Arc; use std::time::Duration; @@ -219,29 +220,18 @@ impl NetworkStream + Send { } /// A `NetworkListener` for `HttpStream`s. +#[derive(Clone)] pub struct HttpListener { - listener: TcpListener, + listener: Arc, read_timeout : Option, write_timeout: Option, } -impl Clone for HttpListener { - #[inline] - fn clone(&self) -> HttpListener { - HttpListener { - listener: self.listener.try_clone().unwrap(), - - read_timeout : self.read_timeout.clone(), - write_timeout: self.write_timeout.clone(), - } - } -} - impl From for HttpListener { fn from(listener: TcpListener) -> HttpListener { HttpListener { - listener: listener, + listener: Arc::new(listener), read_timeout : None, write_timeout: None,