From 3d85ad057c2e3a4a348b05ec1c8020b7c01a45d9 Mon Sep 17 00:00:00 2001 From: Sean McArthur Date: Sun, 25 Jun 2017 12:47:36 -0700 Subject: [PATCH] perf(http): fetch the current Task far less often --- src/http/conn.rs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/http/conn.rs b/src/http/conn.rs index 85cbe94f..56a49889 100644 --- a/src/http/conn.rs +++ b/src/http/conn.rs @@ -163,7 +163,13 @@ where I: AsyncRead + AsyncWrite, // us that it is ready until we drain it. However, we're currently // finished reading, so we need to park the task to be able to // wake back up later when more reading should happen. - self.state.read_task = Some(::futures::task::current()); + let park = self.state.read_task.as_ref() + .map(|t| !t.will_notify_current()) + .unwrap_or(true); + if park { + trace!("parking current task"); + self.state.read_task = Some(::futures::task::current()); + } } } @@ -191,8 +197,10 @@ where I: AsyncRead + AsyncWrite, Writing::Closed => (), } - if let Some(task) = self.state.read_task.take() { - task.notify(); + if !self.io.is_read_blocked() { + if let Some(ref task) = self.state.read_task { + task.notify(); + } } } @@ -376,7 +384,6 @@ where I: AsyncRead + AsyncWrite, fn poll(&mut self) -> Poll, Self::Error> { trace!("Conn::poll()"); - self.state.read_task.take(); loop { if self.is_read_closed() { @@ -596,6 +603,7 @@ impl State { fn close_read(&mut self) { trace!("State::close_read()"); self.reading = Reading::Closed; + self.read_task = None; self.keep_alive.disable(); }