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 |