diff --git a/src/payload.rs b/src/payload.rs index 695a2a03f..6fb63f69e 100644 --- a/src/payload.rs +++ b/src/payload.rs @@ -159,6 +159,12 @@ impl PayloadWriter for PayloadSender { if shared.borrow().need_read { PayloadStatus::Read } else { + #[cfg(not(test))] + { + if shared.borrow_mut().io_task.is_none() { + shared.borrow_mut().io_task = Some(current_task()); + } + } PayloadStatus::Pause } } else { @@ -176,6 +182,7 @@ struct Inner { items: VecDeque, capacity: usize, task: Option, + io_task: Option, } impl Inner { @@ -189,6 +196,7 @@ impl Inner { need_read: true, capacity: MAX_BUFFER_SIZE, task: None, + io_task: None, } } @@ -248,6 +256,9 @@ impl Inner { if self.need_read && self.task.is_none() { self.task = Some(current_task()); } + if let Some(task) = self.io_task.take() { + task.notify() + } } Ok(Async::Ready(Some(data))) } else if let Some(err) = self.err.take() { @@ -261,6 +272,9 @@ impl Inner { if self.task.is_none() { self.task = Some(current_task()); } + if let Some(task) = self.io_task.take() { + task.notify() + } } Ok(Async::NotReady) }