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

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

Issue 1397113003: relnote: Refactor stream buffer allocation out into a scoped_ptr. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Merge with TOT Created 5 years, 2 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
« no previous file with comments | « net/quic/quic_packet_generator.h ('k') | net/quic/quic_protocol.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/quic_packet_generator.h" 5 #include "net/quic/quic_packet_generator.h"
6 6
7 #include "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "net/quic/quic_ack_notifier.h" 9 #include "net/quic/quic_ack_notifier.h"
10 #include "net/quic/quic_fec_group.h" 10 #include "net/quic/quic_fec_group.h"
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
161 161
162 if (!fin && (iov.total_length == 0)) { 162 if (!fin && (iov.total_length == 0)) {
163 LOG(DFATAL) << "Attempt to consume empty data without FIN."; 163 LOG(DFATAL) << "Attempt to consume empty data without FIN.";
164 return QuicConsumedData(0, false); 164 return QuicConsumedData(0, false);
165 } 165 }
166 166
167 int frames_created = 0; 167 int frames_created = 0;
168 while (delegate_->ShouldGeneratePacket( 168 while (delegate_->ShouldGeneratePacket(
169 HAS_RETRANSMITTABLE_DATA, has_handshake ? IS_HANDSHAKE : NOT_HANDSHAKE)) { 169 HAS_RETRANSMITTABLE_DATA, has_handshake ? IS_HANDSHAKE : NOT_HANDSHAKE)) {
170 QuicFrame frame; 170 QuicFrame frame;
171 scoped_ptr<char[]> buffer; 171 UniqueStreamBuffer buffer;
172 size_t bytes_consumed = packet_creator_.CreateStreamFrame( 172 size_t bytes_consumed = packet_creator_.CreateStreamFrame(
173 id, iov, total_bytes_consumed, offset + total_bytes_consumed, fin, 173 id, iov, total_bytes_consumed, offset + total_bytes_consumed, fin,
174 &frame, &buffer); 174 &frame, &buffer);
175 ++frames_created; 175 ++frames_created;
176 176
177 // We want to track which packet this stream frame ends up in. 177 // We want to track which packet this stream frame ends up in.
178 if (notifier != nullptr) { 178 if (notifier != nullptr) {
179 ack_notifiers_.push_back(notifier); 179 ack_notifiers_.push_back(notifier);
180 } 180 }
181 181
182 if (!AddFrame(frame, buffer.get(), has_handshake)) { 182 if (!AddFrame(frame, buffer.Pass(), has_handshake)) {
183 LOG(DFATAL) << "Failed to add stream frame."; 183 LOG(DFATAL) << "Failed to add stream frame.";
184 // Inability to add a STREAM frame creates an unrecoverable hole in a 184 // Inability to add a STREAM frame creates an unrecoverable hole in a
185 // the stream, so it's best to close the connection. 185 // the stream, so it's best to close the connection.
186 delegate_->CloseConnection(QUIC_INTERNAL_ERROR, false); 186 delegate_->CloseConnection(QUIC_INTERNAL_ERROR, false);
187 delete notifier; 187 delete notifier;
188 return QuicConsumedData(0, false); 188 return QuicConsumedData(0, false);
189 } 189 }
190 // When AddFrame succeeds, it takes ownership of the buffer.
191 ignore_result(buffer.release());
192 190
193 total_bytes_consumed += bytes_consumed; 191 total_bytes_consumed += bytes_consumed;
194 fin_consumed = fin && total_bytes_consumed == iov.total_length; 192 fin_consumed = fin && total_bytes_consumed == iov.total_length;
195 DCHECK(total_bytes_consumed == iov.total_length || 193 DCHECK(total_bytes_consumed == iov.total_length ||
196 packet_creator_.BytesFree() == 0u); 194 packet_creator_.BytesFree() == 0u);
197 195
198 if (!InBatchMode() || !packet_creator_.HasRoomForStreamFrame(id, offset)) { 196 if (!InBatchMode() || !packet_creator_.HasRoomForStreamFrame(id, offset)) {
199 // TODO(rtenneti): remove MaybeSendFecPacketAndCloseGroup() from inside 197 // TODO(rtenneti): remove MaybeSendFecPacketAndCloseGroup() from inside
200 // SerializeAndSendPacket() and make it an explicit call here (and 198 // SerializeAndSendPacket() and make it an explicit call here (and
201 // elsewhere where we call SerializeAndSendPacket?). 199 // elsewhere where we call SerializeAndSendPacket?).
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after
435 if (!AddFrame(queued_control_frames_.back(), nullptr, 433 if (!AddFrame(queued_control_frames_.back(), nullptr,
436 /*needs_padding=*/false)) { 434 /*needs_padding=*/false)) {
437 // Packet was full. 435 // Packet was full.
438 return false; 436 return false;
439 } 437 }
440 queued_control_frames_.pop_back(); 438 queued_control_frames_.pop_back();
441 return true; 439 return true;
442 } 440 }
443 441
444 bool QuicPacketGenerator::AddFrame(const QuicFrame& frame, 442 bool QuicPacketGenerator::AddFrame(const QuicFrame& frame,
445 char* buffer, 443 UniqueStreamBuffer buffer,
446 bool needs_padding) { 444 bool needs_padding) {
447 bool success = needs_padding 445 bool success = needs_padding
448 ? packet_creator_.AddPaddedSavedFrame(frame, buffer) 446 ? packet_creator_.AddPaddedSavedFrame(frame, buffer.Pass())
449 : packet_creator_.AddSavedFrame(frame, buffer); 447 : packet_creator_.AddSavedFrame(frame, buffer.Pass());
450 if (success && debug_delegate_) { 448 if (success && debug_delegate_) {
451 debug_delegate_->OnFrameAddedToPacket(frame); 449 debug_delegate_->OnFrameAddedToPacket(frame);
452 } 450 }
453 return success; 451 return success;
454 } 452 }
455 453
456 void QuicPacketGenerator::SerializeAndSendPacket() { 454 void QuicPacketGenerator::SerializeAndSendPacket() {
457 // The optimized encryption algorithm implementations run faster when 455 // The optimized encryption algorithm implementations run faster when
458 // operating on aligned memory. 456 // operating on aligned memory.
459 // 457 //
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
555 void QuicPacketGenerator::set_encryption_level(EncryptionLevel level) { 553 void QuicPacketGenerator::set_encryption_level(EncryptionLevel level) {
556 packet_creator_.set_encryption_level(level); 554 packet_creator_.set_encryption_level(level);
557 } 555 }
558 556
559 void QuicPacketGenerator::SetEncrypter(EncryptionLevel level, 557 void QuicPacketGenerator::SetEncrypter(EncryptionLevel level,
560 QuicEncrypter* encrypter) { 558 QuicEncrypter* encrypter) {
561 packet_creator_.SetEncrypter(level, encrypter); 559 packet_creator_.SetEncrypter(level, encrypter);
562 } 560 }
563 561
564 } // namespace net 562 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_packet_generator.h ('k') | net/quic/quic_protocol.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698