Chromium Code Reviews| OLD | NEW |
|---|---|
| 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/chromium/spdy_session_pool.h" | 5 #include "net/spdy/chromium/spdy_session_pool.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
| (...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 431 direct || request->url().SchemeIs(url::kHttpsScheme); | 431 direct || request->url().SchemeIs(url::kHttpsScheme); |
| 432 request->OnStreamReady( | 432 request->OnStreamReady( |
| 433 used_ssl_config, used_proxy_info, | 433 used_ssl_config, used_proxy_info, |
| 434 base::MakeUnique<SpdyHttpStream>(spdy_session, use_relative_url, | 434 base::MakeUnique<SpdyHttpStream>(spdy_session, use_relative_url, |
| 435 source_dependency)); | 435 source_dependency)); |
| 436 } | 436 } |
| 437 } | 437 } |
| 438 // TODO(mbelshe): Alert other valid requests. | 438 // TODO(mbelshe): Alert other valid requests. |
| 439 } | 439 } |
| 440 | 440 |
| 441 bool SpdySessionPool::StartRequest(const SpdySessionKey& spdy_session_key, | |
| 442 const base::Closure& callback) { | |
| 443 auto iter = spdy_session_pending_request_map_.find(spdy_session_key); | |
| 444 if (iter == spdy_session_pending_request_map_.end()) { | |
| 445 spdy_session_pending_request_map_.emplace(spdy_session_key, | |
| 446 std::list<base::Closure>{}); | |
| 447 return true; | |
| 448 } | |
| 449 iter->second.push_back(callback); | |
| 450 return false; | |
| 451 } | |
| 452 | |
| 453 void SpdySessionPool::ResumeAllPendingRequests( | |
| 454 const SpdySessionKey& spdy_session_key) { | |
| 455 auto iter = spdy_session_pending_request_map_.find(spdy_session_key); | |
| 456 if (iter != spdy_session_pending_request_map_.end()) { | |
| 457 for (auto callback : iter->second) { | |
| 458 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, callback); | |
| 459 } | |
| 460 spdy_session_pending_request_map_.erase(iter); | |
| 461 } | |
| 462 } | |
| 463 | |
| 464 void SpdySessionPool::ResumeNextPendingRequest( | |
| 465 const SpdySessionKey& spdy_session_key) { | |
| 466 auto iter = spdy_session_pending_request_map_.find(spdy_session_key); | |
| 467 if (iter != spdy_session_pending_request_map_.end()) { | |
| 468 base::Closure callback = iter->second.front(); | |
| 469 if (iter->second.size() == 1) | |
| 470 spdy_session_pending_request_map_.erase(iter); | |
| 471 iter->second.pop_front(); | |
|
Bence
2017/06/09 19:17:39
Do not dereference |iter| after it's erased. How
xunjieli
2017/06/13 15:23:11
Done. Thanks!
| |
| 472 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, callback); | |
| 473 } | |
| 474 } | |
| 475 | |
| 441 void SpdySessionPool::AddRequestToSpdySessionRequestMap( | 476 void SpdySessionPool::AddRequestToSpdySessionRequestMap( |
| 442 const SpdySessionKey& spdy_session_key, | 477 const SpdySessionKey& spdy_session_key, |
| 443 HttpStreamFactoryImpl::Request* request) { | 478 HttpStreamFactoryImpl::Request* request) { |
| 444 if (request->HasSpdySessionKey()) | 479 if (request->HasSpdySessionKey()) |
| 445 return; | 480 return; |
| 446 RequestSet& request_set = spdy_session_request_map_[spdy_session_key]; | 481 RequestSet& request_set = spdy_session_request_map_[spdy_session_key]; |
| 447 DCHECK(!base::ContainsKey(request_set, request)); | 482 DCHECK(!base::ContainsKey(request_set, request)); |
| 448 request_set.insert(request); | 483 request_set.insert(request); |
| 449 request->SetSpdySessionKey(spdy_session_key); | 484 request->SetSpdySessionKey(spdy_session_key); |
| 450 } | 485 } |
| 451 | 486 |
| 452 void SpdySessionPool::RemoveRequestFromSpdySessionRequestMap( | 487 void SpdySessionPool::RemoveRequestFromSpdySessionRequestMap( |
| 453 HttpStreamFactoryImpl::Request* request) { | 488 HttpStreamFactoryImpl::Request* request) { |
| 454 if (!request->HasSpdySessionKey()) | 489 if (!request->HasSpdySessionKey()) |
| 455 return; | 490 return; |
| 456 const SpdySessionKey& spdy_session_key = request->GetSpdySessionKey(); | 491 const SpdySessionKey& spdy_session_key = request->GetSpdySessionKey(); |
| 457 auto iter = spdy_session_request_map_.find(spdy_session_key); | 492 auto iter = spdy_session_request_map_.find(spdy_session_key); |
| 458 DCHECK(iter != spdy_session_request_map_.end()); | 493 DCHECK(iter != spdy_session_request_map_.end()); |
| 459 RequestSet& request_set = iter->second; | 494 RequestSet& request_set = iter->second; |
| 460 DCHECK(base::ContainsKey(request_set, request)); | 495 DCHECK(base::ContainsKey(request_set, request)); |
| 461 request_set.erase(request); | 496 request_set.erase(request); |
| 462 if (request_set.empty()) | 497 if (request_set.empty()) |
| 463 spdy_session_request_map_.erase(spdy_session_key); | 498 spdy_session_request_map_.erase(spdy_session_key); |
| 464 request->ResetSpdySessionKey(); | 499 request->ResetSpdySessionKey(); |
| 500 ResumeNextPendingRequest(spdy_session_key); | |
| 465 } | 501 } |
| 466 | 502 |
| 467 void SpdySessionPool::DumpMemoryStats( | 503 void SpdySessionPool::DumpMemoryStats( |
| 468 base::trace_event::ProcessMemoryDump* pmd, | 504 base::trace_event::ProcessMemoryDump* pmd, |
| 469 const SpdyString& parent_dump_absolute_name) const { | 505 const SpdyString& parent_dump_absolute_name) const { |
| 470 if (sessions_.empty()) | 506 if (sessions_.empty()) |
| 471 return; | 507 return; |
| 472 size_t total_size = 0; | 508 size_t total_size = 0; |
| 473 size_t buffer_size = 0; | 509 size_t buffer_size = 0; |
| 474 size_t cert_count = 0; | 510 size_t cert_count = 0; |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 574 | 610 |
| 575 if (idle_only && (*it)->is_active()) | 611 if (idle_only && (*it)->is_active()) |
| 576 continue; | 612 continue; |
| 577 | 613 |
| 578 (*it)->CloseSessionOnError(error, description); | 614 (*it)->CloseSessionOnError(error, description); |
| 579 DCHECK(!IsSessionAvailable(*it)); | 615 DCHECK(!IsSessionAvailable(*it)); |
| 580 } | 616 } |
| 581 } | 617 } |
| 582 | 618 |
| 583 } // namespace net | 619 } // namespace net |
| OLD | NEW |