diff options
Diffstat (limited to 'net/socket/client_socket_pool_base.cc')
-rw-r--r-- | net/socket/client_socket_pool_base.cc | 75 |
1 files changed, 43 insertions, 32 deletions
diff --git a/net/socket/client_socket_pool_base.cc b/net/socket/client_socket_pool_base.cc index 4a5b118..b1ddd40 100644 --- a/net/socket/client_socket_pool_base.cc +++ b/net/socket/client_socket_pool_base.cc @@ -82,6 +82,10 @@ ConnectJob::~ConnectJob() { net_log().EndEvent(NetLog::TYPE_SOCKET_POOL_CONNECT_JOB); } +scoped_ptr<StreamSocket> ConnectJob::PassSocket() { + return socket_.Pass(); +} + int ConnectJob::Connect() { if (timeout_duration_ != base::TimeDelta()) timer_.Start(FROM_HERE, timeout_duration_, this, &ConnectJob::OnTimeout); @@ -100,16 +104,16 @@ int ConnectJob::Connect() { return rv; } -void ConnectJob::set_socket(StreamSocket* socket) { +void ConnectJob::SetSocket(scoped_ptr<StreamSocket> socket) { if (socket) { net_log().AddEvent(NetLog::TYPE_CONNECT_JOB_SET_SOCKET, socket->NetLog().source().ToEventParametersCallback()); } - socket_.reset(socket); + socket_ = socket.Pass(); } void ConnectJob::NotifyDelegateOfCompletion(int rv) { - // The delegate will delete |this|. + // The delegate will own |this|. Delegate* delegate = delegate_; delegate_ = NULL; @@ -135,7 +139,7 @@ void ConnectJob::LogConnectCompletion(int net_error) { void ConnectJob::OnTimeout() { // Make sure the socket is NULL before calling into |delegate|. - set_socket(NULL); + SetSocket(scoped_ptr<StreamSocket>()); net_log_.AddEvent(NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_TIMED_OUT); @@ -392,11 +396,11 @@ int ClientSocketPoolBaseHelper::RequestSocketInternal( if (rv == OK) { LogBoundConnectJobToRequest(connect_job->net_log().source(), request); if (!preconnecting) { - HandOutSocket(connect_job->ReleaseSocket(), false /* not reused */, + HandOutSocket(connect_job->PassSocket(), false /* not reused */, connect_job->connect_timing(), handle, base::TimeDelta(), group, request->net_log()); } else { - AddIdleSocket(connect_job->ReleaseSocket(), group); + AddIdleSocket(connect_job->PassSocket(), group); } } else if (rv == ERR_IO_PENDING) { // If we don't have any sockets in this group, set a timer for potentially @@ -409,17 +413,17 @@ int ClientSocketPoolBaseHelper::RequestSocketInternal( connecting_socket_count_++; - group->AddJob(connect_job.release(), preconnecting); + group->AddJob(connect_job.Pass(), preconnecting); } else { LogBoundConnectJobToRequest(connect_job->net_log().source(), request); - StreamSocket* error_socket = NULL; + scoped_ptr<StreamSocket> error_socket; if (!preconnecting) { DCHECK(handle); connect_job->GetAdditionalErrorState(handle); - error_socket = connect_job->ReleaseSocket(); + error_socket = connect_job->PassSocket(); } if (error_socket) { - HandOutSocket(error_socket, false /* not reused */, + HandOutSocket(error_socket.Pass(), false /* not reused */, connect_job->connect_timing(), handle, base::TimeDelta(), group, request->net_log()); } else if (group->IsEmpty()) { @@ -469,7 +473,7 @@ bool ClientSocketPoolBaseHelper::AssignIdleSocketToRequest( IdleSocket idle_socket = *idle_socket_it; idle_sockets->erase(idle_socket_it); HandOutSocket( - idle_socket.socket, + scoped_ptr<StreamSocket>(idle_socket.socket), idle_socket.socket->WasEverUsed(), LoadTimingInfo::ConnectTiming(), request->handle(), @@ -495,11 +499,11 @@ void ClientSocketPoolBaseHelper::CancelRequest( if (callback_it != pending_callback_map_.end()) { int result = callback_it->second.result; pending_callback_map_.erase(callback_it); - StreamSocket* socket = handle->release_socket(); + scoped_ptr<StreamSocket> socket = handle->PassSocket(); if (socket) { if (result != OK) socket->Disconnect(); - ReleaseSocket(handle->group_name(), socket, handle->id()); + ReleaseSocket(handle->group_name(), socket.Pass(), handle->id()); } return; } @@ -756,7 +760,7 @@ void ClientSocketPoolBaseHelper::StartIdleSocketTimer() { } void ClientSocketPoolBaseHelper::ReleaseSocket(const std::string& group_name, - StreamSocket* socket, + scoped_ptr<StreamSocket> socket, int id) { GroupMap::iterator i = group_map_.find(group_name); CHECK(i != group_map_.end()); @@ -773,10 +777,10 @@ void ClientSocketPoolBaseHelper::ReleaseSocket(const std::string& group_name, id == pool_generation_number_; if (can_reuse) { // Add it to the idle list. - AddIdleSocket(socket, group); + AddIdleSocket(socket.Pass(), group); OnAvailableSocketSlot(group_name, group); } else { - delete socket; + socket.reset(); } CheckForStalledSocketGroups(); @@ -854,13 +858,16 @@ void ClientSocketPoolBaseHelper::OnConnectJobComplete( CHECK(group_it != group_map_.end()); Group* group = group_it->second; - scoped_ptr<StreamSocket> socket(job->ReleaseSocket()); + scoped_ptr<StreamSocket> socket = job->PassSocket(); // Copies of these are needed because |job| may be deleted before they are // accessed. BoundNetLog job_log = job->net_log(); LoadTimingInfo::ConnectTiming connect_timing = job->connect_timing(); + // RemoveConnectJob(job, _) must be called by all branches below; + // otherwise, |job| will be leaked. + if (result == OK) { DCHECK(socket.get()); RemoveConnectJob(job, group); @@ -869,12 +876,12 @@ void ClientSocketPoolBaseHelper::OnConnectJobComplete( group->mutable_pending_requests()->begin(), group)); LogBoundConnectJobToRequest(job_log.source(), r.get()); HandOutSocket( - socket.release(), false /* unused socket */, connect_timing, + socket.Pass(), false /* unused socket */, connect_timing, r->handle(), base::TimeDelta(), group, r->net_log()); r->net_log().EndEvent(NetLog::TYPE_SOCKET_POOL); InvokeUserCallbackLater(r->handle(), r->callback(), result); } else { - AddIdleSocket(socket.release(), group); + AddIdleSocket(socket.Pass(), group); OnAvailableSocketSlot(group_name, group); CheckForStalledSocketGroups(); } @@ -890,7 +897,7 @@ void ClientSocketPoolBaseHelper::OnConnectJobComplete( RemoveConnectJob(job, group); if (socket.get()) { handed_out_socket = true; - HandOutSocket(socket.release(), false /* unused socket */, + HandOutSocket(socket.Pass(), false /* unused socket */, connect_timing, r->handle(), base::TimeDelta(), group, r->net_log()); } @@ -975,7 +982,7 @@ void ClientSocketPoolBaseHelper::ProcessPendingRequest( } void ClientSocketPoolBaseHelper::HandOutSocket( - StreamSocket* socket, + scoped_ptr<StreamSocket> socket, bool reused, const LoadTimingInfo::ConnectTiming& connect_timing, ClientSocketHandle* handle, @@ -983,7 +990,7 @@ void ClientSocketPoolBaseHelper::HandOutSocket( Group* group, const BoundNetLog& net_log) { DCHECK(socket); - handle->set_socket(socket); + handle->SetSocket(socket.Pass()); handle->set_is_reused(reused); handle->set_idle_time(idle_time); handle->set_pool_id(pool_generation_number_); @@ -996,18 +1003,20 @@ void ClientSocketPoolBaseHelper::HandOutSocket( "idle_ms", static_cast<int>(idle_time.InMilliseconds()))); } - net_log.AddEvent(NetLog::TYPE_SOCKET_POOL_BOUND_TO_SOCKET, - socket->NetLog().source().ToEventParametersCallback()); + net_log.AddEvent( + NetLog::TYPE_SOCKET_POOL_BOUND_TO_SOCKET, + handle->socket()->NetLog().source().ToEventParametersCallback()); handed_out_socket_count_++; group->IncrementActiveSocketCount(); } void ClientSocketPoolBaseHelper::AddIdleSocket( - StreamSocket* socket, Group* group) { + scoped_ptr<StreamSocket> socket, + Group* group) { DCHECK(socket); IdleSocket idle_socket; - idle_socket.socket = socket; + idle_socket.socket = socket.release(); idle_socket.start_time = base::TimeTicks::Now(); group->mutable_idle_sockets()->push_back(idle_socket); @@ -1178,13 +1187,13 @@ bool ClientSocketPoolBaseHelper::Group::TryToUseUnassignedConnectJob() { return true; } -void ClientSocketPoolBaseHelper::Group::AddJob(ConnectJob* job, +void ClientSocketPoolBaseHelper::Group::AddJob(scoped_ptr<ConnectJob> job, bool is_preconnect) { SanityCheck(); if (is_preconnect) ++unassigned_job_count_; - jobs_.insert(job); + jobs_.insert(job.release()); } void ClientSocketPoolBaseHelper::Group::RemoveJob(ConnectJob* job) { @@ -1224,15 +1233,17 @@ void ClientSocketPoolBaseHelper::Group::OnBackupSocketTimerFired( if (pending_requests_.empty()) return; - ConnectJob* backup_job = pool->connect_job_factory_->NewConnectJob( - group_name, **pending_requests_.begin(), pool); + scoped_ptr<ConnectJob> backup_job = + pool->connect_job_factory_->NewConnectJob( + group_name, **pending_requests_.begin(), pool); backup_job->net_log().AddEvent(NetLog::TYPE_SOCKET_BACKUP_CREATED); SIMPLE_STATS_COUNTER("socket.backup_created"); int rv = backup_job->Connect(); pool->connecting_socket_count_++; - AddJob(backup_job, false); + ConnectJob* raw_backup_job = backup_job.get(); + AddJob(backup_job.Pass(), false); if (rv != ERR_IO_PENDING) - pool->OnConnectJobComplete(rv, backup_job); + pool->OnConnectJobComplete(rv, raw_backup_job); } void ClientSocketPoolBaseHelper::Group::SanityCheck() { |