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

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

Issue 2169583002: Eliminate SpdyHeaderBlock copy in SpdyStream. (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 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
202 202
203 std::unique_ptr<SpdySerializedFrame> SpdyStream::ProduceSynStreamFrame() { 203 std::unique_ptr<SpdySerializedFrame> SpdyStream::ProduceSynStreamFrame() {
204 CHECK_EQ(io_state_, STATE_IDLE); 204 CHECK_EQ(io_state_, STATE_IDLE);
205 CHECK(request_headers_valid_); 205 CHECK(request_headers_valid_);
206 CHECK_GT(stream_id_, 0u); 206 CHECK_GT(stream_id_, 0u);
207 207
208 SpdyControlFlags flags = 208 SpdyControlFlags flags =
209 (pending_send_status_ == NO_MORE_DATA_TO_SEND) ? 209 (pending_send_status_ == NO_MORE_DATA_TO_SEND) ?
210 CONTROL_FLAG_FIN : CONTROL_FLAG_NONE; 210 CONTROL_FLAG_FIN : CONTROL_FLAG_NONE;
211 std::unique_ptr<SpdySerializedFrame> frame(session_->CreateSynStream( 211 std::unique_ptr<SpdySerializedFrame> frame(session_->CreateSynStream(
212 stream_id_, priority_, flags, request_headers_.Clone())); 212 stream_id_, priority_, flags, std::move(request_headers_)));
213 request_headers_valid_ = false;
213 send_time_ = base::TimeTicks::Now(); 214 send_time_ = base::TimeTicks::Now();
214 return frame; 215 return frame;
215 } 216 }
216 217
217 void SpdyStream::DetachDelegate() { 218 void SpdyStream::DetachDelegate() {
218 DCHECK(!IsClosed()); 219 DCHECK(!IsClosed());
219 delegate_ = NULL; 220 delegate_ = NULL;
220 Cancel(); 221 Cancel();
221 } 222 }
222 223
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after
466 467
467 void SpdyStream::OnPushPromiseHeadersReceived(const SpdyHeaderBlock& headers) { 468 void SpdyStream::OnPushPromiseHeadersReceived(const SpdyHeaderBlock& headers) {
468 CHECK(!request_headers_valid_); 469 CHECK(!request_headers_valid_);
469 CHECK_EQ(io_state_, STATE_IDLE); 470 CHECK_EQ(io_state_, STATE_IDLE);
470 CHECK_EQ(type_, SPDY_PUSH_STREAM); 471 CHECK_EQ(type_, SPDY_PUSH_STREAM);
471 DCHECK(!delegate_); 472 DCHECK(!delegate_);
472 473
473 io_state_ = STATE_RESERVED_REMOTE; 474 io_state_ = STATE_RESERVED_REMOTE;
474 request_headers_ = headers.Clone(); 475 request_headers_ = headers.Clone();
475 request_headers_valid_ = true; 476 request_headers_valid_ = true;
477 url_from_header_block_ = GetUrlFromHeaderBlock(request_headers_);
476 } 478 }
477 479
478 void SpdyStream::OnDataReceived(std::unique_ptr<SpdyBuffer> buffer) { 480 void SpdyStream::OnDataReceived(std::unique_ptr<SpdyBuffer> buffer) {
479 DCHECK(session_->IsStreamActive(stream_id_)); 481 DCHECK(session_->IsStreamActive(stream_id_));
480 482
481 // Track our bandwidth. 483 // Track our bandwidth.
482 recv_bytes_ += buffer ? buffer->GetRemainingSize() : 0; 484 recv_bytes_ += buffer ? buffer->GetRemainingSize() : 0;
483 recv_last_byte_time_ = base::TimeTicks::Now(); 485 recv_last_byte_time_ = base::TimeTicks::Now();
484 486
485 // If we're still buffering data for a push stream, we will do the 487 // If we're still buffering data for a push stream, we will do the
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
684 686
685 int SpdyStream::SendRequestHeaders(SpdyHeaderBlock request_headers, 687 int SpdyStream::SendRequestHeaders(SpdyHeaderBlock request_headers,
686 SpdySendStatus send_status) { 688 SpdySendStatus send_status) {
687 CHECK_NE(type_, SPDY_PUSH_STREAM); 689 CHECK_NE(type_, SPDY_PUSH_STREAM);
688 CHECK_EQ(pending_send_status_, MORE_DATA_TO_SEND); 690 CHECK_EQ(pending_send_status_, MORE_DATA_TO_SEND);
689 CHECK(!request_headers_valid_); 691 CHECK(!request_headers_valid_);
690 CHECK(!pending_send_data_.get()); 692 CHECK(!pending_send_data_.get());
691 CHECK_EQ(io_state_, STATE_IDLE); 693 CHECK_EQ(io_state_, STATE_IDLE);
692 request_headers_ = std::move(request_headers); 694 request_headers_ = std::move(request_headers);
693 request_headers_valid_ = true; 695 request_headers_valid_ = true;
696 url_from_header_block_ = GetUrlFromHeaderBlock(request_headers_);
694 pending_send_status_ = send_status; 697 pending_send_status_ = send_status;
695 session_->EnqueueStreamWrite(GetWeakPtr(), SYN_STREAM, 698 session_->EnqueueStreamWrite(GetWeakPtr(), SYN_STREAM,
696 std::unique_ptr<SpdyBufferProducer>( 699 std::unique_ptr<SpdyBufferProducer>(
697 new SynStreamBufferProducer(GetWeakPtr()))); 700 new SynStreamBufferProducer(GetWeakPtr())));
698 return ERR_IO_PENDING; 701 return ERR_IO_PENDING;
699 } 702 }
700 703
701 void SpdyStream::SendData(IOBuffer* data, 704 void SpdyStream::SendData(IOBuffer* data,
702 int length, 705 int length,
703 SpdySendStatus send_status) { 706 SpdySendStatus send_status) {
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
768 if (type_ == SPDY_PUSH_STREAM) { 771 if (type_ == SPDY_PUSH_STREAM) {
769 load_timing_info->push_start = recv_first_byte_time_; 772 load_timing_info->push_start = recv_first_byte_time_;
770 bool done_receiving = IsClosed() || (!pending_recv_data_.empty() && 773 bool done_receiving = IsClosed() || (!pending_recv_data_.empty() &&
771 !pending_recv_data_.back()); 774 !pending_recv_data_.back());
772 if (done_receiving) 775 if (done_receiving)
773 load_timing_info->push_end = recv_last_byte_time_; 776 load_timing_info->push_end = recv_last_byte_time_;
774 } 777 }
775 return result; 778 return result;
776 } 779 }
777 780
778 GURL SpdyStream::GetUrlFromHeaders() const {
779 if (!request_headers_valid_)
780 return GURL();
781
782 return GetUrlFromHeaderBlock(request_headers_);
783 }
784
785 bool SpdyStream::HasUrlFromHeaders() const {
786 return !GetUrlFromHeaders().is_empty();
787 }
788
789 void SpdyStream::UpdateHistograms() { 781 void SpdyStream::UpdateHistograms() {
790 // We need at least the receive timers to be filled in, as otherwise 782 // We need at least the receive timers to be filled in, as otherwise
791 // metrics can be bogus. 783 // metrics can be bogus.
792 if (recv_first_byte_time_.is_null() || recv_last_byte_time_.is_null()) 784 if (recv_first_byte_time_.is_null() || recv_last_byte_time_.is_null())
793 return; 785 return;
794 786
795 base::TimeTicks effective_send_time; 787 base::TimeTicks effective_send_time;
796 if (type_ == SPDY_PUSH_STREAM) { 788 if (type_ == SPDY_PUSH_STREAM) {
797 // Push streams shouldn't have |send_time_| filled in. 789 // Push streams shouldn't have |send_time_| filled in.
798 DCHECK(send_time_.is_null()); 790 DCHECK(send_time_.is_null());
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
939 description = base::StringPrintf("Unknown state 0x%08X (%u)", state, 931 description = base::StringPrintf("Unknown state 0x%08X (%u)", state,
940 state); 932 state);
941 break; 933 break;
942 } 934 }
943 return description; 935 return description;
944 } 936 }
945 937
946 #undef STATE_CASE 938 #undef STATE_CASE
947 939
948 } // namespace net 940 } // 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