Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(951)

Unified Diff: net/spdy/spdy_stream.cc

Issue 14311002: [SPDY] Avoid leaking bytes from the session flow control receive window (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/spdy/spdy_stream.h ('k') | net/spdy/spdy_stream_spdy2_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
« no previous file with comments | « net/spdy/spdy_stream.h ('k') | net/spdy/spdy_stream_spdy2_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698