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

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

Issue 3035015: SPDY: Fix DeleteStream() being called twice and CloseStream() reporting a wrong stream number. (Closed)
Patch Set: merge with trunk -- again Created 10 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 | « no previous file | no next file » | 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) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 "base/logging.h" 7 #include "base/logging.h"
8 #include "base/message_loop.h" 8 #include "base/message_loop.h"
9 #include "base/singleton.h" 9 #include "base/singleton.h"
10 #include "net/spdy/spdy_session.h" 10 #include "net/spdy/spdy_session.h"
(...skipping 14 matching lines...) Expand all
25 response_complete_(false), 25 response_complete_(false),
26 io_state_(STATE_NONE), 26 io_state_(STATE_NONE),
27 response_status_(OK), 27 response_status_(OK),
28 cancelled_(false), 28 cancelled_(false),
29 send_bytes_(0), 29 send_bytes_(0),
30 recv_bytes_(0), 30 recv_bytes_(0),
31 histograms_recorded_(false) {} 31 histograms_recorded_(false) {}
32 32
33 SpdyStream::~SpdyStream() { 33 SpdyStream::~SpdyStream() {
34 DLOG(INFO) << "Deleting SpdyStream for stream " << stream_id_; 34 DLOG(INFO) << "Deleting SpdyStream for stream " << stream_id_;
35
36 // When the stream_id_ is 0, we expect that it is because
37 // we've cancelled or closed the stream and set the stream_id to 0.
38 if (!stream_id_)
39 DCHECK(response_complete_);
40 } 35 }
41 36
42 void SpdyStream::SetDelegate(Delegate* delegate) { 37 void SpdyStream::SetDelegate(Delegate* delegate) {
43 CHECK(delegate); 38 CHECK(delegate);
44 delegate_ = delegate; 39 delegate_ = delegate;
45 40
46 if (!response_->empty()) { 41 if (!response_->empty()) {
47 // The stream already got response. 42 // The stream already got response.
48 delegate_->OnResponseReceived(*response_, response_time_, OK); 43 delegate_->OnResponseReceived(*response_, response_time_, OK);
49 } 44 }
50 45
51 std::vector<scoped_refptr<IOBufferWithSize> > buffers; 46 std::vector<scoped_refptr<IOBufferWithSize> > buffers;
52 buffers.swap(pending_buffers_); 47 buffers.swap(pending_buffers_);
53 for (size_t i = 0; i < buffers.size(); ++i) { 48 for (size_t i = 0; i < buffers.size(); ++i) {
54 if (delegate_) 49 if (delegate_)
55 delegate_->OnDataReceived(buffers[i]->data(), buffers[i]->size()); 50 delegate_->OnDataReceived(buffers[i]->data(), buffers[i]->size());
56 } 51 }
57 } 52 }
58 53
59 void SpdyStream::DetachDelegate() { 54 void SpdyStream::DetachDelegate() {
60 delegate_ = NULL; 55 delegate_ = NULL;
61 if (!cancelled()) 56 if (!response_complete_ && !cancelled())
62 Cancel(); 57 Cancel();
63 } 58 }
64 59
65 const linked_ptr<spdy::SpdyHeaderBlock>& SpdyStream::spdy_headers() const { 60 const linked_ptr<spdy::SpdyHeaderBlock>& SpdyStream::spdy_headers() const {
66 return request_; 61 return request_;
67 } 62 }
68 63
69 void SpdyStream::set_spdy_headers( 64 void SpdyStream::set_spdy_headers(
70 const linked_ptr<spdy::SpdyHeaderBlock>& headers) { 65 const linked_ptr<spdy::SpdyHeaderBlock>& headers) {
71 request_ = headers; 66 request_ = headers;
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
207 202
208 if (status > 0) 203 if (status > 0)
209 send_bytes_ += status; 204 send_bytes_ += status;
210 205
211 DoLoop(status); 206 DoLoop(status);
212 } 207 }
213 208
214 void SpdyStream::OnClose(int status) { 209 void SpdyStream::OnClose(int status) {
215 response_complete_ = true; 210 response_complete_ = true;
216 response_status_ = status; 211 response_status_ = status;
217 stream_id_ = 0;
218 Delegate* delegate = delegate_; 212 Delegate* delegate = delegate_;
219 delegate_ = NULL; 213 delegate_ = NULL;
220 if (delegate) 214 if (delegate)
221 delegate->OnClose(status); 215 delegate->OnClose(status);
222 } 216 }
223 217
224 void SpdyStream::Cancel() { 218 void SpdyStream::Cancel() {
225 cancelled_ = true; 219 cancelled_ = true;
226 session_->CloseStream(stream_id_, ERR_ABORTED); 220 session_->CloseStream(stream_id_, ERR_ABORTED);
227 } 221 }
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
448 UMA_HISTOGRAM_TIMES("Net.SpdyStreamDownloadTime", 442 UMA_HISTOGRAM_TIMES("Net.SpdyStreamDownloadTime",
449 recv_last_byte_time_ - recv_first_byte_time_); 443 recv_last_byte_time_ - recv_first_byte_time_);
450 UMA_HISTOGRAM_TIMES("Net.SpdyStreamTime", 444 UMA_HISTOGRAM_TIMES("Net.SpdyStreamTime",
451 recv_last_byte_time_ - send_time_); 445 recv_last_byte_time_ - send_time_);
452 446
453 UMA_HISTOGRAM_COUNTS("Net.SpdySendBytes", send_bytes_); 447 UMA_HISTOGRAM_COUNTS("Net.SpdySendBytes", send_bytes_);
454 UMA_HISTOGRAM_COUNTS("Net.SpdyRecvBytes", recv_bytes_); 448 UMA_HISTOGRAM_COUNTS("Net.SpdyRecvBytes", recv_bytes_);
455 } 449 }
456 450
457 } // namespace net 451 } // namespace net
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698