Index: net/spdy/spdy_stream.cc |
diff --git a/net/spdy/spdy_stream.cc b/net/spdy/spdy_stream.cc |
index 3de3716e018962805c88c70734c6e10befd5baf5..2d7f5e6b7b965a761cf9905d273c7797655b2aba 100644 |
--- a/net/spdy/spdy_stream.cc |
+++ b/net/spdy/spdy_stream.cc |
@@ -311,41 +311,6 @@ void SpdyStream::DecreaseSendWindowSize(int32 delta_window_size) { |
stream_id_, -delta_window_size, send_window_size_)); |
} |
-void SpdyStream::IncreaseRecvWindowSize(int32 delta_window_size) { |
- if (session_->flow_control_state() < SpdySession::FLOW_CONTROL_STREAM) |
- return; |
- |
- // Call back into the session, since this is the only |
- // window-size-related function that is called by the delegate |
- // instead of by the session. |
- session_->IncreaseRecvWindowSize(delta_window_size); |
- |
- // By the time a read is processed by the delegate, this stream may |
- // already be inactive. |
- if (!session_->IsStreamActive(stream_id_)) |
- return; |
- |
- DCHECK_GE(unacked_recv_window_bytes_, 0); |
- DCHECK_GE(recv_window_size_, unacked_recv_window_bytes_); |
- DCHECK_GE(delta_window_size, 1); |
- // Check for overflow. |
- DCHECK_LE(delta_window_size, kint32max - recv_window_size_); |
- |
- recv_window_size_ += delta_window_size; |
- net_log_.AddEvent( |
- NetLog::TYPE_SPDY_STREAM_UPDATE_RECV_WINDOW, |
- base::Bind(&NetLogSpdyStreamWindowUpdateCallback, |
- stream_id_, delta_window_size, recv_window_size_)); |
- |
- unacked_recv_window_bytes_ += delta_window_size; |
- if (unacked_recv_window_bytes_ > |
- session_->stream_initial_recv_window_size() / 2) { |
- session_->SendStreamWindowUpdate( |
- stream_id_, static_cast<uint32>(unacked_recv_window_bytes_)); |
- unacked_recv_window_bytes_ = 0; |
- } |
-} |
- |
int SpdyStream::GetPeerAddress(IPEndPoint* address) const { |
return session_->GetPeerAddress(address); |
} |
@@ -488,8 +453,12 @@ void SpdyStream::OnDataReceived(scoped_ptr<SpdyBuffer> buffer) { |
size_t length = buffer->GetRemainingSize(); |
DCHECK_LE(length, session_->GetDataFrameMaximumPayload()); |
- if (session_->flow_control_state() >= SpdySession::FLOW_CONTROL_STREAM) |
+ if (session_->flow_control_state() >= SpdySession::FLOW_CONTROL_STREAM) { |
DecreaseRecvWindowSize(static_cast<int32>(length)); |
+ buffer->AddConsumeCallback( |
+ base::Bind(&SpdyStream::IncreaseRecvWindowSize, |
+ weak_ptr_factory_.GetWeakPtr())); |
+ } |
// Track our bandwidth. |
metrics_.RecordBytes(length); |
@@ -920,6 +889,37 @@ void SpdyStream::UpdateHistograms() { |
UMA_HISTOGRAM_COUNTS("Net.SpdyRecvBytes", recv_bytes_); |
} |
+void SpdyStream::IncreaseRecvWindowSize(size_t delta_window_size) { |
+ if (session_->flow_control_state() < SpdySession::FLOW_CONTROL_STREAM) |
+ return; |
+ |
+ // By the time a read is processed by the delegate, this stream may |
+ // already be inactive. |
+ if (!session_->IsStreamActive(stream_id_)) |
+ return; |
+ |
+ DCHECK_GE(unacked_recv_window_bytes_, 0); |
+ DCHECK_GE(recv_window_size_, unacked_recv_window_bytes_); |
+ DCHECK_GE(delta_window_size, 1u); |
+ // Check for overflow. |
+ DCHECK_LE(delta_window_size, |
+ static_cast<size_t>(kint32max - recv_window_size_)); |
+ |
+ recv_window_size_ += delta_window_size; |
+ net_log_.AddEvent( |
+ NetLog::TYPE_SPDY_STREAM_UPDATE_RECV_WINDOW, |
+ base::Bind(&NetLogSpdyStreamWindowUpdateCallback, |
+ stream_id_, delta_window_size, recv_window_size_)); |
+ |
+ unacked_recv_window_bytes_ += delta_window_size; |
+ if (unacked_recv_window_bytes_ > |
+ session_->stream_initial_recv_window_size() / 2) { |
+ session_->SendStreamWindowUpdate( |
+ stream_id_, static_cast<uint32>(unacked_recv_window_bytes_)); |
+ unacked_recv_window_bytes_ = 0; |
+ } |
+} |
+ |
void SpdyStream::DecreaseRecvWindowSize(int32 delta_window_size) { |
DCHECK(session_->IsStreamActive(stream_id_)); |
DCHECK_GE(session_->flow_control_state(), SpdySession::FLOW_CONTROL_STREAM); |