| @@ -102,22 +102,31 @@ impl<C: NetworkConnector<Stream=S>, S: NetworkStream + Send> NetworkConnector fo | |||||||
|     type Stream = PooledStream<S>; |     type Stream = PooledStream<S>; | ||||||
|     fn connect(&self, host: &str, port: u16, scheme: &str) -> ::Result<PooledStream<S>> { |     fn connect(&self, host: &str, port: u16, scheme: &str) -> ::Result<PooledStream<S>> { | ||||||
|         let key = key(host, port, scheme); |         let key = key(host, port, scheme); | ||||||
|         let mut should_remove = false; |  | ||||||
|         let inner = match self.inner.lock().unwrap().conns.get_mut(&key) { |         let inner = { | ||||||
|             Some(ref mut vec) => { |             // keep the mutex locked only in this block | ||||||
|  |             let mut locked = self.inner.lock().unwrap(); | ||||||
|  |             let mut should_remove = false; | ||||||
|  |             let inner = locked.conns.get_mut(&key).map(|vec| { | ||||||
|                 trace!("Pool had connection, using"); |                 trace!("Pool had connection, using"); | ||||||
|                 should_remove = vec.len() == 1; |                 should_remove = vec.len() == 1; | ||||||
|                 vec.pop().unwrap() |                 vec.pop().unwrap() | ||||||
|  |             }); | ||||||
|  |             if should_remove { | ||||||
|  |                 locked.conns.remove(&key); | ||||||
|             } |             } | ||||||
|  |             inner | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |         let inner = match inner { | ||||||
|  |             Some(inner) => inner, | ||||||
|             None => PooledStreamInner { |             None => PooledStreamInner { | ||||||
|                 key: key.clone(), |                 key: key.clone(), | ||||||
|                 stream: try!(self.connector.connect(host, port, scheme)), |                 stream: try!(self.connector.connect(host, port, scheme)), | ||||||
|                 previous_response_expected_no_content: false, |                 previous_response_expected_no_content: false, | ||||||
|             } |             } | ||||||
|  |  | ||||||
|         }; |         }; | ||||||
|         if should_remove { |  | ||||||
|             self.inner.lock().unwrap().conns.remove(&key); |  | ||||||
|         } |  | ||||||
|         Ok(PooledStream { |         Ok(PooledStream { | ||||||
|             inner: Some(inner), |             inner: Some(inner), | ||||||
|             is_closed: false, |             is_closed: false, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user