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

Side by Side Diff: net/http/http_stream_factory_impl_request.cc

Issue 9567025: Ensure pipelined requests are sent in the same order they're queued. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Created 8 years, 9 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
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/http/http_stream_factory_impl_request.h" 5 #include "net/http/http_stream_factory_impl_request.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/stl_util.h" 8 #include "base/stl_util.h"
9 #include "net/http/http_stream_factory_impl_job.h" 9 #include "net/http/http_stream_factory_impl_job.h"
10 #include "net/spdy/spdy_http_stream.h" 10 #include "net/spdy/spdy_http_stream.h"
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
56 DCHECK(!ContainsKey(request_set, this)); 56 DCHECK(!ContainsKey(request_set, this));
57 request_set.insert(this); 57 request_set.insert(this);
58 } 58 }
59 59
60 bool HttpStreamFactoryImpl::Request::SetHttpPipeliningKey( 60 bool HttpStreamFactoryImpl::Request::SetHttpPipeliningKey(
61 const HttpPipelinedHost::Key& http_pipelining_key) { 61 const HttpPipelinedHost::Key& http_pipelining_key) {
62 DCHECK(!http_pipelining_key_.get()); 62 DCHECK(!http_pipelining_key_.get());
63 http_pipelining_key_.reset(new HttpPipelinedHost::Key(http_pipelining_key)); 63 http_pipelining_key_.reset(new HttpPipelinedHost::Key(http_pipelining_key));
64 bool was_new_key = !ContainsKey(factory_->http_pipelining_request_map_, 64 bool was_new_key = !ContainsKey(factory_->http_pipelining_request_map_,
65 http_pipelining_key); 65 http_pipelining_key);
66 RequestSet& request_set = 66 RequestVector& request_vector =
67 factory_->http_pipelining_request_map_[http_pipelining_key]; 67 factory_->http_pipelining_request_map_[http_pipelining_key];
68 DCHECK(!ContainsKey(request_set, this)); 68 request_vector.push_back(this);
69 request_set.insert(this);
70 return was_new_key; 69 return was_new_key;
71 } 70 }
72 71
73 void HttpStreamFactoryImpl::Request::AttachJob(Job* job) { 72 void HttpStreamFactoryImpl::Request::AttachJob(Job* job) {
74 DCHECK(job); 73 DCHECK(job);
75 jobs_.insert(job); 74 jobs_.insert(job);
76 factory_->request_map_[job] = this; 75 factory_->request_map_[job] = this;
77 } 76 }
78 77
79 void HttpStreamFactoryImpl::Request::Complete( 78 void HttpStreamFactoryImpl::Request::Complete(
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
260 spdy_session_key_.reset(); 259 spdy_session_key_.reset();
261 } 260 }
262 } 261 }
263 262
264 void 263 void
265 HttpStreamFactoryImpl::Request::RemoveRequestFromHttpPipeliningRequestMap() { 264 HttpStreamFactoryImpl::Request::RemoveRequestFromHttpPipeliningRequestMap() {
266 if (http_pipelining_key_.get()) { 265 if (http_pipelining_key_.get()) {
267 HttpPipeliningRequestMap& http_pipelining_request_map = 266 HttpPipeliningRequestMap& http_pipelining_request_map =
268 factory_->http_pipelining_request_map_; 267 factory_->http_pipelining_request_map_;
269 DCHECK(ContainsKey(http_pipelining_request_map, *http_pipelining_key_)); 268 DCHECK(ContainsKey(http_pipelining_request_map, *http_pipelining_key_));
270 RequestSet& request_set = 269 RequestVector& request_vector =
271 http_pipelining_request_map[*http_pipelining_key_]; 270 http_pipelining_request_map[*http_pipelining_key_];
272 DCHECK(ContainsKey(request_set, this)); 271 for (RequestVector::iterator it = request_vector.begin();
273 request_set.erase(this); 272 it != request_vector.end(); ++it) {
274 if (request_set.empty()) 273 if (*it == this) {
274 request_vector.erase(it);
275 break;
276 }
277 }
278 if (request_vector.empty())
275 http_pipelining_request_map.erase(*http_pipelining_key_); 279 http_pipelining_request_map.erase(*http_pipelining_key_);
276 http_pipelining_key_.reset(); 280 http_pipelining_key_.reset();
277 } 281 }
278 } 282 }
279 283
280 void HttpStreamFactoryImpl::Request::OnSpdySessionReady( 284 void HttpStreamFactoryImpl::Request::OnSpdySessionReady(
281 Job* job, 285 Job* job,
282 scoped_refptr<SpdySession> spdy_session, 286 scoped_refptr<SpdySession> spdy_session,
283 bool direct) { 287 bool direct) {
284 DCHECK(job); 288 DCHECK(job);
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
333 RemoveRequestFromHttpPipeliningRequestMap(); 337 RemoveRequestFromHttpPipeliningRequestMap();
334 338
335 std::set<Job*> tmp; 339 std::set<Job*> tmp;
336 tmp.swap(jobs_); 340 tmp.swap(jobs_);
337 341
338 for (std::set<Job*>::iterator it = tmp.begin(); it != tmp.end(); ++it) 342 for (std::set<Job*>::iterator it = tmp.begin(); it != tmp.end(); ++it)
339 factory_->OrphanJob(*it, this); 343 factory_->OrphanJob(*it, this);
340 } 344 }
341 345
342 } // namespace net 346 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698