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

Side by Side Diff: net/spdy/spdy_stream.cc

Issue 2144933005: Move some SpdyHeaderBlock instances from heap to stack. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 5 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/spdy/spdy_stream.h ('k') | net/spdy/spdy_stream_unittest.cc » ('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/spdy/spdy_stream.h" 5 #include "net/spdy/spdy_stream.h"
6 6
7 #include <limits> 7 #include <limits>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 stream_id_(0), 93 stream_id_(0),
94 url_(url), 94 url_(url),
95 priority_(priority), 95 priority_(priority),
96 send_stalled_by_flow_control_(false), 96 send_stalled_by_flow_control_(false),
97 send_window_size_(initial_send_window_size), 97 send_window_size_(initial_send_window_size),
98 max_recv_window_size_(max_recv_window_size), 98 max_recv_window_size_(max_recv_window_size),
99 recv_window_size_(max_recv_window_size), 99 recv_window_size_(max_recv_window_size),
100 unacked_recv_window_bytes_(0), 100 unacked_recv_window_bytes_(0),
101 session_(session), 101 session_(session),
102 delegate_(NULL), 102 delegate_(NULL),
103 request_headers_valid_(false),
103 pending_send_status_(MORE_DATA_TO_SEND), 104 pending_send_status_(MORE_DATA_TO_SEND),
104 request_time_(base::Time::Now()), 105 request_time_(base::Time::Now()),
105 response_headers_status_(RESPONSE_HEADERS_ARE_INCOMPLETE), 106 response_headers_status_(RESPONSE_HEADERS_ARE_INCOMPLETE),
106 io_state_(STATE_IDLE), 107 io_state_(STATE_IDLE),
107 response_status_(OK), 108 response_status_(OK),
108 net_log_(net_log), 109 net_log_(net_log),
109 raw_received_bytes_(0), 110 raw_received_bytes_(0),
110 raw_sent_bytes_(0), 111 raw_sent_bytes_(0),
111 send_bytes_(0), 112 send_bytes_(0),
112 recv_bytes_(0), 113 recv_bytes_(0),
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
194 session_->CloseActiveStream(stream_id_, OK); 195 session_->CloseActiveStream(stream_id_, OK);
195 DCHECK(!weak_this); 196 DCHECK(!weak_this);
196 // |pending_recv_data_| is invalid at this point. 197 // |pending_recv_data_| is invalid at this point.
197 break; 198 break;
198 } 199 }
199 } 200 }
200 } 201 }
201 202
202 std::unique_ptr<SpdySerializedFrame> SpdyStream::ProduceSynStreamFrame() { 203 std::unique_ptr<SpdySerializedFrame> SpdyStream::ProduceSynStreamFrame() {
203 CHECK_EQ(io_state_, STATE_IDLE); 204 CHECK_EQ(io_state_, STATE_IDLE);
204 CHECK(request_headers_); 205 CHECK(request_headers_valid_);
205 CHECK_GT(stream_id_, 0u); 206 CHECK_GT(stream_id_, 0u);
206 207
207 SpdyControlFlags flags = 208 SpdyControlFlags flags =
208 (pending_send_status_ == NO_MORE_DATA_TO_SEND) ? 209 (pending_send_status_ == NO_MORE_DATA_TO_SEND) ?
209 CONTROL_FLAG_FIN : CONTROL_FLAG_NONE; 210 CONTROL_FLAG_FIN : CONTROL_FLAG_NONE;
210 std::unique_ptr<SpdySerializedFrame> frame(session_->CreateSynStream( 211 std::unique_ptr<SpdySerializedFrame> frame(session_->CreateSynStream(
211 stream_id_, priority_, flags, request_headers_->Clone())); 212 stream_id_, priority_, flags, request_headers_.Clone()));
212 send_time_ = base::TimeTicks::Now(); 213 send_time_ = base::TimeTicks::Now();
213 return frame; 214 return frame;
214 } 215 }
215 216
216 void SpdyStream::DetachDelegate() { 217 void SpdyStream::DetachDelegate() {
217 DCHECK(!IsClosed()); 218 DCHECK(!IsClosed());
218 delegate_ = NULL; 219 delegate_ = NULL;
219 Cancel(); 220 Cancel();
220 } 221 }
221 222
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after
457 response_headers_status_ == RESPONSE_HEADERS_ARE_COMPLETE) { 458 response_headers_status_ == RESPONSE_HEADERS_ARE_COMPLETE) {
458 session_->ResetStream( 459 session_->ResetStream(
459 stream_id_, RST_STREAM_PROTOCOL_ERROR, 460 stream_id_, RST_STREAM_PROTOCOL_ERROR,
460 "Additional headers received for push stream"); 461 "Additional headers received for push stream");
461 return ERR_SPDY_PROTOCOL_ERROR; 462 return ERR_SPDY_PROTOCOL_ERROR;
462 } 463 }
463 return MergeWithResponseHeaders(additional_response_headers); 464 return MergeWithResponseHeaders(additional_response_headers);
464 } 465 }
465 466
466 void SpdyStream::OnPushPromiseHeadersReceived(const SpdyHeaderBlock& headers) { 467 void SpdyStream::OnPushPromiseHeadersReceived(const SpdyHeaderBlock& headers) {
467 CHECK(!request_headers_.get()); 468 CHECK(!request_headers_valid_);
468 CHECK_EQ(io_state_, STATE_IDLE); 469 CHECK_EQ(io_state_, STATE_IDLE);
469 CHECK_EQ(type_, SPDY_PUSH_STREAM); 470 CHECK_EQ(type_, SPDY_PUSH_STREAM);
470 DCHECK(!delegate_); 471 DCHECK(!delegate_);
471 472
472 io_state_ = STATE_RESERVED_REMOTE; 473 io_state_ = STATE_RESERVED_REMOTE;
473 request_headers_.reset(new SpdyHeaderBlock(headers.Clone())); 474 request_headers_ = headers.Clone();
475 request_headers_valid_ = true;
474 } 476 }
475 477
476 void SpdyStream::OnDataReceived(std::unique_ptr<SpdyBuffer> buffer) { 478 void SpdyStream::OnDataReceived(std::unique_ptr<SpdyBuffer> buffer) {
477 DCHECK(session_->IsStreamActive(stream_id_)); 479 DCHECK(session_->IsStreamActive(stream_id_));
478 480
479 // Track our bandwidth. 481 // Track our bandwidth.
480 recv_bytes_ += buffer ? buffer->GetRemainingSize() : 0; 482 recv_bytes_ += buffer ? buffer->GetRemainingSize() : 0;
481 recv_last_byte_time_ = base::TimeTicks::Now(); 483 recv_last_byte_time_ = base::TimeTicks::Now();
482 484
483 // If we're still buffering data for a push stream, we will do the 485 // If we're still buffering data for a push stream, we will do the
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
673 } else { 675 } else {
674 session_->CloseCreatedStream(GetWeakPtr(), OK); 676 session_->CloseCreatedStream(GetWeakPtr(), OK);
675 } 677 }
676 // |this| is invalid at this point. 678 // |this| is invalid at this point.
677 } 679 }
678 680
679 base::WeakPtr<SpdyStream> SpdyStream::GetWeakPtr() { 681 base::WeakPtr<SpdyStream> SpdyStream::GetWeakPtr() {
680 return weak_ptr_factory_.GetWeakPtr(); 682 return weak_ptr_factory_.GetWeakPtr();
681 } 683 }
682 684
683 int SpdyStream::SendRequestHeaders( 685 int SpdyStream::SendRequestHeaders(SpdyHeaderBlock request_headers,
684 std::unique_ptr<SpdyHeaderBlock> request_headers, 686 SpdySendStatus send_status) {
685 SpdySendStatus send_status) {
686 CHECK_NE(type_, SPDY_PUSH_STREAM); 687 CHECK_NE(type_, SPDY_PUSH_STREAM);
687 CHECK_EQ(pending_send_status_, MORE_DATA_TO_SEND); 688 CHECK_EQ(pending_send_status_, MORE_DATA_TO_SEND);
688 CHECK(!request_headers_); 689 CHECK(!request_headers_valid_);
689 CHECK(!pending_send_data_.get()); 690 CHECK(!pending_send_data_.get());
690 CHECK_EQ(io_state_, STATE_IDLE); 691 CHECK_EQ(io_state_, STATE_IDLE);
691 request_headers_ = std::move(request_headers); 692 request_headers_ = std::move(request_headers);
693 request_headers_valid_ = true;
692 pending_send_status_ = send_status; 694 pending_send_status_ = send_status;
693 session_->EnqueueStreamWrite(GetWeakPtr(), SYN_STREAM, 695 session_->EnqueueStreamWrite(GetWeakPtr(), SYN_STREAM,
694 std::unique_ptr<SpdyBufferProducer>( 696 std::unique_ptr<SpdyBufferProducer>(
695 new SynStreamBufferProducer(GetWeakPtr()))); 697 new SynStreamBufferProducer(GetWeakPtr())));
696 return ERR_IO_PENDING; 698 return ERR_IO_PENDING;
697 } 699 }
698 700
699 void SpdyStream::SendData(IOBuffer* data, 701 void SpdyStream::SendData(IOBuffer* data,
700 int length, 702 int length,
701 SpdySendStatus send_status) { 703 SpdySendStatus send_status) {
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
767 load_timing_info->push_start = recv_first_byte_time_; 769 load_timing_info->push_start = recv_first_byte_time_;
768 bool done_receiving = IsClosed() || (!pending_recv_data_.empty() && 770 bool done_receiving = IsClosed() || (!pending_recv_data_.empty() &&
769 !pending_recv_data_.back()); 771 !pending_recv_data_.back());
770 if (done_receiving) 772 if (done_receiving)
771 load_timing_info->push_end = recv_last_byte_time_; 773 load_timing_info->push_end = recv_last_byte_time_;
772 } 774 }
773 return result; 775 return result;
774 } 776 }
775 777
776 GURL SpdyStream::GetUrlFromHeaders() const { 778 GURL SpdyStream::GetUrlFromHeaders() const {
777 if (!request_headers_) 779 if (!request_headers_valid_)
778 return GURL(); 780 return GURL();
779 781
780 return GetUrlFromHeaderBlock(*request_headers_); 782 return GetUrlFromHeaderBlock(request_headers_);
781 } 783 }
782 784
783 bool SpdyStream::HasUrlFromHeaders() const { 785 bool SpdyStream::HasUrlFromHeaders() const {
784 return !GetUrlFromHeaders().is_empty(); 786 return !GetUrlFromHeaders().is_empty();
785 } 787 }
786 788
787 void SpdyStream::UpdateHistograms() { 789 void SpdyStream::UpdateHistograms() {
788 // We need at least the receive timers to be filled in, as otherwise 790 // We need at least the receive timers to be filled in, as otherwise
789 // metrics can be bogus. 791 // metrics can be bogus.
790 if (recv_first_byte_time_.is_null() || recv_last_byte_time_.is_null()) 792 if (recv_first_byte_time_.is_null() || recv_last_byte_time_.is_null())
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
937 description = base::StringPrintf("Unknown state 0x%08X (%u)", state, 939 description = base::StringPrintf("Unknown state 0x%08X (%u)", state,
938 state); 940 state);
939 break; 941 break;
940 } 942 }
941 return description; 943 return description;
942 } 944 }
943 945
944 #undef STATE_CASE 946 #undef STATE_CASE
945 947
946 } // namespace net 948 } // namespace net
OLDNEW
« no previous file with comments | « net/spdy/spdy_stream.h ('k') | net/spdy/spdy_stream_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698