| OLD | NEW |
| 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/socket/client_socket_pool_base.h" | 5 #include "net/socket/client_socket_pool_base.h" |
| 6 | 6 |
| 7 #include "base/compiler_specific.h" | 7 #include "base/compiler_specific.h" |
| 8 #include "base/format_macros.h" | 8 #include "base/format_macros.h" |
| 9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
| 10 #include "base/metrics/stats_counters.h" | 10 #include "base/metrics/stats_counters.h" |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 80 return rv; | 80 return rv; |
| 81 } | 81 } |
| 82 | 82 |
| 83 void ConnectJob::UseForNormalRequest() { | 83 void ConnectJob::UseForNormalRequest() { |
| 84 DCHECK_EQ(UNUSED_PRECONNECT, preconnect_state_); | 84 DCHECK_EQ(UNUSED_PRECONNECT, preconnect_state_); |
| 85 preconnect_state_ = USED_PRECONNECT; | 85 preconnect_state_ = USED_PRECONNECT; |
| 86 } | 86 } |
| 87 | 87 |
| 88 void ConnectJob::set_socket(ClientSocket* socket) { | 88 void ConnectJob::set_socket(ClientSocket* socket) { |
| 89 if (socket) { | 89 if (socket) { |
| 90 net_log().AddEvent(NetLog::TYPE_CONNECT_JOB_SET_SOCKET, | 90 net_log().AddEvent(NetLog::TYPE_CONNECT_JOB_SET_SOCKET, make_scoped_refptr( |
| 91 new NetLogSourceParameter("source_dependency", | 91 new NetLogSourceParameter("source_dependency", |
| 92 socket->NetLog().source())); | 92 socket->NetLog().source()))); |
| 93 } | 93 } |
| 94 socket_.reset(socket); | 94 socket_.reset(socket); |
| 95 } | 95 } |
| 96 | 96 |
| 97 void ConnectJob::NotifyDelegateOfCompletion(int rv) { | 97 void ConnectJob::NotifyDelegateOfCompletion(int rv) { |
| 98 // The delegate will delete |this|. | 98 // The delegate will delete |this|. |
| 99 Delegate *delegate = delegate_; | 99 Delegate *delegate = delegate_; |
| 100 delegate_ = NULL; | 100 delegate_ = NULL; |
| 101 | 101 |
| 102 LogConnectCompletion(rv); | 102 LogConnectCompletion(rv); |
| 103 delegate->OnConnectJobComplete(rv, this); | 103 delegate->OnConnectJobComplete(rv, this); |
| 104 } | 104 } |
| 105 | 105 |
| 106 void ConnectJob::ResetTimer(base::TimeDelta remaining_time) { | 106 void ConnectJob::ResetTimer(base::TimeDelta remaining_time) { |
| 107 timer_.Stop(); | 107 timer_.Stop(); |
| 108 timer_.Start(remaining_time, this, &ConnectJob::OnTimeout); | 108 timer_.Start(remaining_time, this, &ConnectJob::OnTimeout); |
| 109 } | 109 } |
| 110 | 110 |
| 111 void ConnectJob::LogConnectStart() { | 111 void ConnectJob::LogConnectStart() { |
| 112 net_log().BeginEvent(NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_CONNECT, | 112 net_log().BeginEvent(NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_CONNECT, |
| 113 new NetLogStringParameter("group_name", group_name_)); | 113 make_scoped_refptr(new NetLogStringParameter("group_name", group_name_))); |
| 114 } | 114 } |
| 115 | 115 |
| 116 void ConnectJob::LogConnectCompletion(int net_error) { | 116 void ConnectJob::LogConnectCompletion(int net_error) { |
| 117 scoped_refptr<NetLog::EventParameters> params; | 117 scoped_refptr<NetLog::EventParameters> params; |
| 118 if (net_error != OK) | 118 if (net_error != OK) |
| 119 params = new NetLogIntegerParameter("net_error", net_error); | 119 params = new NetLogIntegerParameter("net_error", net_error); |
| 120 net_log().EndEvent(NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_CONNECT, params); | 120 net_log().EndEvent(NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_CONNECT, params); |
| 121 } | 121 } |
| 122 | 122 |
| 123 void ConnectJob::OnTimeout() { | 123 void ConnectJob::OnTimeout() { |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 232 DCHECK(!request.callback()); | 232 DCHECK(!request.callback()); |
| 233 DCHECK(!request.handle()); | 233 DCHECK(!request.handle()); |
| 234 | 234 |
| 235 if (num_sockets > max_sockets_per_group_) { | 235 if (num_sockets > max_sockets_per_group_) { |
| 236 NOTREACHED(); | 236 NOTREACHED(); |
| 237 num_sockets = max_sockets_per_group_; | 237 num_sockets = max_sockets_per_group_; |
| 238 } | 238 } |
| 239 | 239 |
| 240 request.net_log().BeginEvent( | 240 request.net_log().BeginEvent( |
| 241 NetLog::TYPE_SOCKET_POOL_CONNECTING_N_SOCKETS, | 241 NetLog::TYPE_SOCKET_POOL_CONNECTING_N_SOCKETS, |
| 242 new NetLogIntegerParameter("num_sockets", num_sockets)); | 242 make_scoped_refptr(new NetLogIntegerParameter( |
| 243 "num_sockets", num_sockets))); |
| 243 | 244 |
| 244 Group* group = GetOrCreateGroup(group_name); | 245 Group* group = GetOrCreateGroup(group_name); |
| 245 | 246 |
| 246 for (int num_iterations_left = num_sockets; | 247 for (int num_iterations_left = num_sockets; |
| 247 group->NumActiveSocketSlots() < num_sockets && | 248 group->NumActiveSocketSlots() < num_sockets && |
| 248 num_iterations_left > 0 ; num_iterations_left--) { | 249 num_iterations_left > 0 ; num_iterations_left--) { |
| 249 int rv = RequestSocketInternal(group_name, &request); | 250 int rv = RequestSocketInternal(group_name, &request); |
| 250 if (rv < 0 && rv != ERR_IO_PENDING) { | 251 if (rv < 0 && rv != ERR_IO_PENDING) { |
| 251 // We're encountering a synchronous error. Give up. | 252 // We're encountering a synchronous error. Give up. |
| 252 break; | 253 break; |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 387 } | 388 } |
| 388 | 389 |
| 389 return false; | 390 return false; |
| 390 } | 391 } |
| 391 | 392 |
| 392 // static | 393 // static |
| 393 void ClientSocketPoolBaseHelper::LogBoundConnectJobToRequest( | 394 void ClientSocketPoolBaseHelper::LogBoundConnectJobToRequest( |
| 394 const NetLog::Source& connect_job_source, const Request* request) { | 395 const NetLog::Source& connect_job_source, const Request* request) { |
| 395 request->net_log().AddEvent( | 396 request->net_log().AddEvent( |
| 396 NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB, | 397 NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB, |
| 397 new NetLogSourceParameter("source_dependency", connect_job_source)); | 398 make_scoped_refptr(new NetLogSourceParameter( |
| 399 "source_dependency", connect_job_source))); |
| 398 } | 400 } |
| 399 | 401 |
| 400 void ClientSocketPoolBaseHelper::CancelRequest( | 402 void ClientSocketPoolBaseHelper::CancelRequest( |
| 401 const std::string& group_name, ClientSocketHandle* handle) { | 403 const std::string& group_name, ClientSocketHandle* handle) { |
| 402 PendingCallbackMap::iterator callback_it = pending_callback_map_.find(handle); | 404 PendingCallbackMap::iterator callback_it = pending_callback_map_.find(handle); |
| 403 if (callback_it != pending_callback_map_.end()) { | 405 if (callback_it != pending_callback_map_.end()) { |
| 404 int result = callback_it->second.result; | 406 int result = callback_it->second.result; |
| 405 pending_callback_map_.erase(callback_it); | 407 pending_callback_map_.erase(callback_it); |
| 406 ClientSocket* socket = handle->release_socket(); | 408 ClientSocket* socket = handle->release_socket(); |
| 407 if (socket) { | 409 if (socket) { |
| (...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 756 scoped_ptr<const Request> r(RemoveRequestFromQueue( | 758 scoped_ptr<const Request> r(RemoveRequestFromQueue( |
| 757 group->mutable_pending_requests()->begin(), group)); | 759 group->mutable_pending_requests()->begin(), group)); |
| 758 LogBoundConnectJobToRequest(job_log.source(), r.get()); | 760 LogBoundConnectJobToRequest(job_log.source(), r.get()); |
| 759 job->GetAdditionalErrorState(r->handle()); | 761 job->GetAdditionalErrorState(r->handle()); |
| 760 RemoveConnectJob(job, group); | 762 RemoveConnectJob(job, group); |
| 761 if (socket.get()) { | 763 if (socket.get()) { |
| 762 handed_out_socket = true; | 764 handed_out_socket = true; |
| 763 HandOutSocket(socket.release(), false /* unused socket */, r->handle(), | 765 HandOutSocket(socket.release(), false /* unused socket */, r->handle(), |
| 764 base::TimeDelta(), group, r->net_log()); | 766 base::TimeDelta(), group, r->net_log()); |
| 765 } | 767 } |
| 766 r->net_log().EndEvent(NetLog::TYPE_SOCKET_POOL, | 768 r->net_log().EndEvent(NetLog::TYPE_SOCKET_POOL, make_scoped_refptr( |
| 767 new NetLogIntegerParameter("net_error", result)); | 769 new NetLogIntegerParameter("net_error", result))); |
| 768 InvokeUserCallbackLater(r->handle(), r->callback(), result); | 770 InvokeUserCallbackLater(r->handle(), r->callback(), result); |
| 769 } else { | 771 } else { |
| 770 RemoveConnectJob(job, group); | 772 RemoveConnectJob(job, group); |
| 771 } | 773 } |
| 772 if (!handed_out_socket) { | 774 if (!handed_out_socket) { |
| 773 OnAvailableSocketSlot(group_name, group); | 775 OnAvailableSocketSlot(group_name, group); |
| 774 CheckForStalledSocketGroups(); | 776 CheckForStalledSocketGroups(); |
| 775 } | 777 } |
| 776 } | 778 } |
| 777 } | 779 } |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 842 const BoundNetLog& net_log) { | 844 const BoundNetLog& net_log) { |
| 843 DCHECK(socket); | 845 DCHECK(socket); |
| 844 handle->set_socket(socket); | 846 handle->set_socket(socket); |
| 845 handle->set_is_reused(reused); | 847 handle->set_is_reused(reused); |
| 846 handle->set_idle_time(idle_time); | 848 handle->set_idle_time(idle_time); |
| 847 handle->set_pool_id(pool_generation_number_); | 849 handle->set_pool_id(pool_generation_number_); |
| 848 | 850 |
| 849 if (reused) { | 851 if (reused) { |
| 850 net_log.AddEvent( | 852 net_log.AddEvent( |
| 851 NetLog::TYPE_SOCKET_POOL_REUSED_AN_EXISTING_SOCKET, | 853 NetLog::TYPE_SOCKET_POOL_REUSED_AN_EXISTING_SOCKET, |
| 852 new NetLogIntegerParameter( | 854 make_scoped_refptr(new NetLogIntegerParameter( |
| 853 "idle_ms", static_cast<int>(idle_time.InMilliseconds()))); | 855 "idle_ms", static_cast<int>(idle_time.InMilliseconds())))); |
| 854 } | 856 } |
| 855 | 857 |
| 856 net_log.AddEvent(NetLog::TYPE_SOCKET_POOL_BOUND_TO_SOCKET, | 858 net_log.AddEvent(NetLog::TYPE_SOCKET_POOL_BOUND_TO_SOCKET, |
| 857 new NetLogSourceParameter( | 859 make_scoped_refptr(new NetLogSourceParameter( |
| 858 "source_dependency", socket->NetLog().source())); | 860 "source_dependency", socket->NetLog().source()))); |
| 859 | 861 |
| 860 handed_out_socket_count_++; | 862 handed_out_socket_count_++; |
| 861 group->IncrementActiveSocketCount(); | 863 group->IncrementActiveSocketCount(); |
| 862 } | 864 } |
| 863 | 865 |
| 864 void ClientSocketPoolBaseHelper::AddIdleSocket( | 866 void ClientSocketPoolBaseHelper::AddIdleSocket( |
| 865 ClientSocket* socket, Group* group) { | 867 ClientSocket* socket, Group* group) { |
| 866 DCHECK(socket); | 868 DCHECK(socket); |
| 867 IdleSocket idle_socket; | 869 IdleSocket idle_socket; |
| 868 idle_socket.socket = socket; | 870 idle_socket.socket = socket; |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1046 // Delete active jobs. | 1048 // Delete active jobs. |
| 1047 STLDeleteElements(&jobs_); | 1049 STLDeleteElements(&jobs_); |
| 1048 | 1050 |
| 1049 // Cancel pending backup job. | 1051 // Cancel pending backup job. |
| 1050 method_factory_.RevokeAll(); | 1052 method_factory_.RevokeAll(); |
| 1051 } | 1053 } |
| 1052 | 1054 |
| 1053 } // namespace internal | 1055 } // namespace internal |
| 1054 | 1056 |
| 1055 } // namespace net | 1057 } // namespace net |
| OLD | NEW |