refactor(client): fix up should_close sentinel value
This commit is contained in:
		| @@ -1,6 +1,6 @@ | ||||
| //! HTTP Client | ||||
|  | ||||
| use std::cell::RefCell; | ||||
| use std::cell::{Cell, RefCell}; | ||||
| use std::fmt; | ||||
| use std::io; | ||||
| use std::marker::PhantomData; | ||||
| @@ -199,10 +199,11 @@ where C: Connect, | ||||
|             let pool_key = Rc::new(domain.to_string()); | ||||
|             self.connector.connect(url) | ||||
|                 .and_then(move |io| { | ||||
|                     let (tx, rx) = mpsc::channel(0); | ||||
|                     // 1 extra slot for possible Close message | ||||
|                     let (tx, rx) = mpsc::channel(1); | ||||
|                     let tx = HyperClient { | ||||
|                         tx: RefCell::new(tx), | ||||
|                         should_close: true, | ||||
|                         should_close: Cell::new(true), | ||||
|                     }; | ||||
|                     let pooled = pool.pooled(pool_key, tx); | ||||
|                     let conn = proto::Conn::<_, _, proto::ClientTransaction, _>::new(io, pooled.clone()); | ||||
| @@ -227,6 +228,7 @@ where C: Connect, | ||||
|             use proto::dispatch::ClientMsg; | ||||
|  | ||||
|             let (callback, rx) = oneshot::channel(); | ||||
|             client.should_close.set(false); | ||||
|  | ||||
|             match client.tx.borrow_mut().start_send(ClientMsg::Request(head, body, callback)) { | ||||
|                 Ok(_) => (), | ||||
| @@ -274,7 +276,12 @@ impl<C, B> fmt::Debug for Client<C, B> { | ||||
| } | ||||
|  | ||||
| struct HyperClient<B> { | ||||
|     should_close: bool, | ||||
|     // A sentinel that is usually always true. If this is dropped | ||||
|     // while true, this will try to shutdown the dispatcher task. | ||||
|     // | ||||
|     // This should be set to false whenever it is checked out of the | ||||
|     // pool and successfully used to send a request. | ||||
|     should_close: Cell<bool>, | ||||
|     tx: RefCell<::futures::sync::mpsc::Sender<proto::dispatch::ClientMsg<B>>>, | ||||
| } | ||||
|  | ||||
| @@ -282,7 +289,7 @@ impl<B> Clone for HyperClient<B> { | ||||
|     fn clone(&self) -> HyperClient<B> { | ||||
|         HyperClient { | ||||
|             tx: self.tx.clone(), | ||||
|             should_close: self.should_close, | ||||
|             should_close: self.should_close.clone(), | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -298,8 +305,8 @@ impl<B> self::pool::Ready for HyperClient<B> { | ||||
|  | ||||
| impl<B> Drop for HyperClient<B> { | ||||
|     fn drop(&mut self) { | ||||
|         if self.should_close { | ||||
|             self.should_close = false; | ||||
|         if self.should_close.get() { | ||||
|             self.should_close.set(false); | ||||
|             let _ = self.tx.borrow_mut().try_send(proto::dispatch::ClientMsg::Close); | ||||
|         } | ||||
|     } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user