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

Side by Side Diff: net/quic/reliable_quic_stream.cc

Issue 12334063: Land recent QUIC changes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: more EXPECT_FALSE Created 7 years, 10 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/quic/reliable_quic_stream.h ('k') | net/quic/test_tools/mock_clock.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/quic/reliable_quic_stream.h" 5 #include "net/quic/reliable_quic_stream.h"
6 6
7 #include "net/quic/quic_session.h" 7 #include "net/quic/quic_session.h"
8 8
9 using base::StringPiece; 9 using base::StringPiece;
10 10
11 namespace net { 11 namespace net {
12 12
13 ReliableQuicStream::ReliableQuicStream(QuicStreamId id, 13 ReliableQuicStream::ReliableQuicStream(QuicStreamId id,
14 QuicSession* session) 14 QuicSession* session)
15 : sequencer_(this), 15 : sequencer_(this),
16 id_(id), 16 id_(id),
17 offset_(0),
18 session_(session), 17 session_(session),
19 visitor_(NULL), 18 visitor_(NULL),
20 stream_bytes_read_(0), 19 stream_bytes_read_(0),
21 stream_bytes_written_(0), 20 stream_bytes_written_(0),
22 error_(QUIC_NO_ERROR), 21 error_(QUIC_NO_ERROR),
23 read_side_closed_(false), 22 read_side_closed_(false),
24 write_side_closed_(false), 23 write_side_closed_(false),
25 fin_buffered_(false), 24 fin_buffered_(false),
26 fin_sent_(false) { 25 fin_sent_(false) {
27 } 26 }
(...skipping 13 matching lines...) Expand all
41 return sequencer_.WillAcceptStreamFrame(frame); 40 return sequencer_.WillAcceptStreamFrame(frame);
42 } 41 }
43 42
44 bool ReliableQuicStream::OnStreamFrame(const QuicStreamFrame& frame) { 43 bool ReliableQuicStream::OnStreamFrame(const QuicStreamFrame& frame) {
45 DCHECK_EQ(frame.stream_id, id_); 44 DCHECK_EQ(frame.stream_id, id_);
46 if (read_side_closed_) { 45 if (read_side_closed_) {
47 DLOG(INFO) << "Ignoring frame " << frame.stream_id; 46 DLOG(INFO) << "Ignoring frame " << frame.stream_id;
48 // We don't want to be reading: blackhole the data. 47 // We don't want to be reading: blackhole the data.
49 return true; 48 return true;
50 } 49 }
50 // Note: This count include duplicate data received.
51 stream_bytes_read_ += frame.data.length();
51 52
52 bool accepted = sequencer_.OnStreamFrame(frame); 53 bool accepted = sequencer_.OnStreamFrame(frame);
53 54
54 if (frame.fin) { 55 if (frame.fin) {
55 sequencer_.CloseStreamAtOffset(frame.offset + frame.data.size(), 56 sequencer_.CloseStreamAtOffset(frame.offset + frame.data.size(), true);
56 true);
57 } 57 }
58 58
59 return accepted; 59 return accepted;
60 } 60 }
61 61
62 void ReliableQuicStream::OnStreamReset(QuicErrorCode error, 62 void ReliableQuicStream::OnStreamReset(QuicErrorCode error) {
63 QuicStreamOffset offset) {
64 error_ = error; 63 error_ = error;
65 sequencer_.CloseStreamAtOffset(offset, false); // Full close. 64 TerminateFromPeer(false); // Full close.
66 } 65 }
67 66
68 void ReliableQuicStream::ConnectionClose(QuicErrorCode error, bool from_peer) { 67 void ReliableQuicStream::ConnectionClose(QuicErrorCode error, bool from_peer) {
69 error_ = error; 68 error_ = error;
70 if (from_peer) { 69 if (from_peer) {
71 TerminateFromPeer(false); 70 TerminateFromPeer(false);
72 } else { 71 } else {
73 CloseWriteSide(); 72 CloseWriteSide();
74 CloseReadSide(); 73 CloseReadSide();
75 } 74 }
76 } 75 }
77 76
78 void ReliableQuicStream::TerminateFromPeer(bool half_close) { 77 void ReliableQuicStream::TerminateFromPeer(bool half_close) {
79 if (!half_close) { 78 if (!half_close) {
80 CloseWriteSide(); 79 CloseWriteSide();
81 } 80 }
82 CloseReadSide(); 81 CloseReadSide();
83 } 82 }
84 83
85 void ReliableQuicStream::Close(QuicErrorCode error) { 84 void ReliableQuicStream::Close(QuicErrorCode error) {
86 error_ = error; 85 error_ = error;
87 session()->SendRstStream(id(), error, offset_); 86 session()->SendRstStream(id(), error);
88 } 87 }
89 88
90 bool ReliableQuicStream::IsHalfClosed() const { 89 bool ReliableQuicStream::IsHalfClosed() const {
91 return sequencer_.IsHalfClosed(); 90 return sequencer_.IsHalfClosed();
92 } 91 }
93 92
94 bool ReliableQuicStream::HasBytesToRead() const { 93 bool ReliableQuicStream::HasBytesToRead() const {
95 return sequencer_.HasBytesToRead(); 94 return sequencer_.HasBytesToRead();
96 } 95 }
97 96
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
144 } 143 }
145 144
146 QuicConsumedData ReliableQuicStream::WriteDataInternal( 145 QuicConsumedData ReliableQuicStream::WriteDataInternal(
147 StringPiece data, bool fin) { 146 StringPiece data, bool fin) {
148 if (write_side_closed_) { 147 if (write_side_closed_) {
149 DLOG(ERROR) << "Attempt to write when the write side is closed"; 148 DLOG(ERROR) << "Attempt to write when the write side is closed";
150 return QuicConsumedData(0, false); 149 return QuicConsumedData(0, false);
151 } 150 }
152 151
153 QuicConsumedData consumed_data = 152 QuicConsumedData consumed_data =
154 session()->WriteData(id(), data, offset_, fin); 153 session()->WriteData(id(), data, stream_bytes_written_, fin);
155 offset_ += consumed_data.bytes_consumed;
156 stream_bytes_written_ += consumed_data.bytes_consumed; 154 stream_bytes_written_ += consumed_data.bytes_consumed;
157 if (consumed_data.bytes_consumed == data.length()) { 155 if (consumed_data.bytes_consumed == data.length()) {
158 if (fin && consumed_data.fin_consumed) { 156 if (fin && consumed_data.fin_consumed) {
159 fin_sent_ = true; 157 fin_sent_ = true;
160 CloseWriteSide(); 158 CloseWriteSide();
161 } 159 }
162 } else { 160 } else {
163 session_->MarkWriteBlocked(id()); 161 session_->MarkWriteBlocked(id());
164 } 162 }
165 return consumed_data; 163 return consumed_data;
(...skipping 29 matching lines...) Expand all
195 if (visitor_) { 193 if (visitor_) {
196 Visitor* visitor = visitor_; 194 Visitor* visitor = visitor_;
197 // Calling Visitor::OnClose() may result the destruction of the visitor, 195 // Calling Visitor::OnClose() may result the destruction of the visitor,
198 // so we need to ensure we don't call it again. 196 // so we need to ensure we don't call it again.
199 visitor_ = NULL; 197 visitor_ = NULL;
200 visitor->OnClose(this); 198 visitor->OnClose(this);
201 } 199 }
202 } 200 }
203 201
204 } // namespace net 202 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/reliable_quic_stream.h ('k') | net/quic/test_tools/mock_clock.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698