| 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/socket/client_socket_pool_base.h" | 5 #include "net/socket/client_socket_pool_base.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" |
| (...skipping 602 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 613 | 613 |
| 614 bool ClientSocketPoolBaseHelper::HasGroup(const std::string& group_name) const { | 614 bool ClientSocketPoolBaseHelper::HasGroup(const std::string& group_name) const { |
| 615 return base::ContainsKey(group_map_, group_name); | 615 return base::ContainsKey(group_map_, group_name); |
| 616 } | 616 } |
| 617 | 617 |
| 618 void ClientSocketPoolBaseHelper::CloseIdleSockets() { | 618 void ClientSocketPoolBaseHelper::CloseIdleSockets() { |
| 619 CleanupIdleSockets(true); | 619 CleanupIdleSockets(true); |
| 620 DCHECK_EQ(0, idle_socket_count_); | 620 DCHECK_EQ(0, idle_socket_count_); |
| 621 } | 621 } |
| 622 | 622 |
| 623 void ClientSocketPoolBaseHelper::CloseIdleSocketsInGroup( |
| 624 const std::string& group_name) { |
| 625 if (idle_socket_count_ == 0) |
| 626 return; |
| 627 GroupMap::iterator it = group_map_.find(group_name); |
| 628 if (it == group_map_.end()) |
| 629 return; |
| 630 CleanupIdleSocketsInGroup(true, it->second, base::TimeTicks::Now()); |
| 631 if (it->second->IsEmpty()) |
| 632 RemoveGroup(it); |
| 633 } |
| 634 |
| 623 int ClientSocketPoolBaseHelper::IdleSocketCountInGroup( | 635 int ClientSocketPoolBaseHelper::IdleSocketCountInGroup( |
| 624 const std::string& group_name) const { | 636 const std::string& group_name) const { |
| 625 GroupMap::const_iterator i = group_map_.find(group_name); | 637 GroupMap::const_iterator i = group_map_.find(group_name); |
| 626 CHECK(i != group_map_.end()); | 638 CHECK(i != group_map_.end()); |
| 627 | 639 |
| 628 return i->second->idle_sockets().size(); | 640 return i->second->idle_sockets().size(); |
| 629 } | 641 } |
| 630 | 642 |
| 631 LoadState ClientSocketPoolBaseHelper::GetLoadState( | 643 LoadState ClientSocketPoolBaseHelper::GetLoadState( |
| 632 const std::string& group_name, | 644 const std::string& group_name, |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 766 if (idle_socket_count_ == 0) | 778 if (idle_socket_count_ == 0) |
| 767 return; | 779 return; |
| 768 | 780 |
| 769 // Current time value. Retrieving it once at the function start rather than | 781 // Current time value. Retrieving it once at the function start rather than |
| 770 // inside the inner loop, since it shouldn't change by any meaningful amount. | 782 // inside the inner loop, since it shouldn't change by any meaningful amount. |
| 771 base::TimeTicks now = base::TimeTicks::Now(); | 783 base::TimeTicks now = base::TimeTicks::Now(); |
| 772 | 784 |
| 773 GroupMap::iterator i = group_map_.begin(); | 785 GroupMap::iterator i = group_map_.begin(); |
| 774 while (i != group_map_.end()) { | 786 while (i != group_map_.end()) { |
| 775 Group* group = i->second; | 787 Group* group = i->second; |
| 776 | 788 CleanupIdleSocketsInGroup(force, group, now); |
| 777 auto idle_socket_it = group->mutable_idle_sockets()->begin(); | |
| 778 while (idle_socket_it != group->idle_sockets().end()) { | |
| 779 base::TimeDelta timeout = idle_socket_it->socket->WasEverUsed() | |
| 780 ? used_idle_socket_timeout_ | |
| 781 : unused_idle_socket_timeout_; | |
| 782 bool timed_out = (now - idle_socket_it->start_time) >= timeout; | |
| 783 bool should_clean_up = force || timed_out || !idle_socket_it->IsUsable(); | |
| 784 if (should_clean_up) { | |
| 785 if (force) { | |
| 786 RecordIdleSocketFate(IDLE_SOCKET_FATE_CLEAN_UP_FORCED); | |
| 787 } else if (timed_out) { | |
| 788 RecordIdleSocketFate( | |
| 789 idle_socket_it->socket->WasEverUsed() | |
| 790 ? IDLE_SOCKET_FATE_CLEAN_UP_TIMED_OUT_REUSED | |
| 791 : IDLE_SOCKET_FATE_CLEAN_UP_TIMED_OUT_UNUSED); | |
| 792 } else { | |
| 793 DCHECK(!idle_socket_it->IsUsable()); | |
| 794 RecordIdleSocketFate(IDLE_SOCKET_FATE_CLEAN_UP_UNUSABLE); | |
| 795 } | |
| 796 delete idle_socket_it->socket; | |
| 797 idle_socket_it = group->mutable_idle_sockets()->erase(idle_socket_it); | |
| 798 DecrementIdleCount(); | |
| 799 } else { | |
| 800 ++idle_socket_it; | |
| 801 } | |
| 802 } | |
| 803 | |
| 804 // Delete group if no longer needed. | 789 // Delete group if no longer needed. |
| 805 if (group->IsEmpty()) { | 790 if (group->IsEmpty()) { |
| 806 RemoveGroup(i++); | 791 RemoveGroup(i++); |
| 807 } else { | 792 } else { |
| 808 ++i; | 793 ++i; |
| 809 } | 794 } |
| 810 } | 795 } |
| 811 } | 796 } |
| 812 | 797 |
| 798 void ClientSocketPoolBaseHelper::CleanupIdleSocketsInGroup( |
| 799 bool force, |
| 800 Group* group, |
| 801 const base::TimeTicks& now) { |
| 802 auto idle_socket_it = group->mutable_idle_sockets()->begin(); |
| 803 while (idle_socket_it != group->idle_sockets().end()) { |
| 804 base::TimeDelta timeout = idle_socket_it->socket->WasEverUsed() |
| 805 ? used_idle_socket_timeout_ |
| 806 : unused_idle_socket_timeout_; |
| 807 bool timed_out = (now - idle_socket_it->start_time) >= timeout; |
| 808 bool should_clean_up = force || timed_out || !idle_socket_it->IsUsable(); |
| 809 if (should_clean_up) { |
| 810 if (force) { |
| 811 RecordIdleSocketFate(IDLE_SOCKET_FATE_CLEAN_UP_FORCED); |
| 812 } else if (timed_out) { |
| 813 RecordIdleSocketFate(idle_socket_it->socket->WasEverUsed() |
| 814 ? IDLE_SOCKET_FATE_CLEAN_UP_TIMED_OUT_REUSED |
| 815 : IDLE_SOCKET_FATE_CLEAN_UP_TIMED_OUT_UNUSED); |
| 816 } else { |
| 817 DCHECK(!idle_socket_it->IsUsable()); |
| 818 RecordIdleSocketFate(IDLE_SOCKET_FATE_CLEAN_UP_UNUSABLE); |
| 819 } |
| 820 delete idle_socket_it->socket; |
| 821 idle_socket_it = group->mutable_idle_sockets()->erase(idle_socket_it); |
| 822 DecrementIdleCount(); |
| 823 } else { |
| 824 ++idle_socket_it; |
| 825 } |
| 826 } |
| 827 } |
| 828 |
| 813 ClientSocketPoolBaseHelper::Group* ClientSocketPoolBaseHelper::GetOrCreateGroup( | 829 ClientSocketPoolBaseHelper::Group* ClientSocketPoolBaseHelper::GetOrCreateGroup( |
| 814 const std::string& group_name) { | 830 const std::string& group_name) { |
| 815 GroupMap::iterator it = group_map_.find(group_name); | 831 GroupMap::iterator it = group_map_.find(group_name); |
| 816 if (it != group_map_.end()) | 832 if (it != group_map_.end()) |
| 817 return it->second; | 833 return it->second; |
| 818 Group* group = new Group; | 834 Group* group = new Group; |
| 819 group_map_[group_name] = group; | 835 group_map_[group_name] = group; |
| 820 return group; | 836 return group; |
| 821 } | 837 } |
| 822 | 838 |
| (...skipping 645 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1468 // If there are no more requests, kill the backup timer. | 1484 // If there are no more requests, kill the backup timer. |
| 1469 if (pending_requests_.empty()) | 1485 if (pending_requests_.empty()) |
| 1470 backup_job_timer_.Stop(); | 1486 backup_job_timer_.Stop(); |
| 1471 request->CrashIfInvalid(); | 1487 request->CrashIfInvalid(); |
| 1472 return request; | 1488 return request; |
| 1473 } | 1489 } |
| 1474 | 1490 |
| 1475 } // namespace internal | 1491 } // namespace internal |
| 1476 | 1492 |
| 1477 } // namespace net | 1493 } // namespace net |
| OLD | NEW |