| 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/stats_counters.h" | 10 #include "base/stats_counters.h" |
| (...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 325 connecting_socket_count_++; | 325 connecting_socket_count_++; |
| 326 group.jobs.insert(group.backup_job); | 326 group.jobs.insert(group.backup_job); |
| 327 ConnectJob* job = group.backup_job; | 327 ConnectJob* job = group.backup_job; |
| 328 group.backup_job = NULL; | 328 group.backup_job = NULL; |
| 329 if (rv != ERR_IO_PENDING) | 329 if (rv != ERR_IO_PENDING) |
| 330 OnConnectJobComplete(rv, job); | 330 OnConnectJobComplete(rv, job); |
| 331 } | 331 } |
| 332 | 332 |
| 333 void ClientSocketPoolBaseHelper::CancelRequest( | 333 void ClientSocketPoolBaseHelper::CancelRequest( |
| 334 const std::string& group_name, const ClientSocketHandle* handle) { | 334 const std::string& group_name, const ClientSocketHandle* handle) { |
| 335 // Running callbacks can cause the last outside reference to be released. |
| 336 // Hold onto a reference. |
| 337 scoped_refptr<ClientSocketPoolBaseHelper> ref_holder(this); |
| 338 |
| 335 CHECK(ContainsKey(group_map_, group_name)); | 339 CHECK(ContainsKey(group_map_, group_name)); |
| 336 | 340 |
| 337 Group& group = group_map_[group_name]; | 341 Group& group = group_map_[group_name]; |
| 338 | 342 |
| 339 // Search pending_requests for matching handle. | 343 // Search pending_requests for matching handle. |
| 340 RequestQueue::iterator it = group.pending_requests.begin(); | 344 RequestQueue::iterator it = group.pending_requests.begin(); |
| 341 for (; it != group.pending_requests.end(); ++it) { | 345 for (; it != group.pending_requests.end(); ++it) { |
| 342 if ((*it)->handle() == handle) { | 346 if ((*it)->handle() == handle) { |
| 343 const Request* req = RemoveRequestFromQueue(it, &group.pending_requests); | 347 const Request* req = RemoveRequestFromQueue(it, &group.pending_requests); |
| 344 req->net_log().AddEvent(NetLog::TYPE_CANCELLED, NULL); | 348 req->net_log().AddEvent(NetLog::TYPE_CANCELLED, NULL); |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 463 &ClientSocketPoolBaseHelper::OnCleanupTimerFired); | 467 &ClientSocketPoolBaseHelper::OnCleanupTimerFired); |
| 464 } | 468 } |
| 465 | 469 |
| 466 void ClientSocketPoolBaseHelper::DecrementIdleCount() { | 470 void ClientSocketPoolBaseHelper::DecrementIdleCount() { |
| 467 if (--idle_socket_count_ == 0) | 471 if (--idle_socket_count_ == 0) |
| 468 timer_.Stop(); | 472 timer_.Stop(); |
| 469 } | 473 } |
| 470 | 474 |
| 471 void ClientSocketPoolBaseHelper::DoReleaseSocket(const std::string& group_name, | 475 void ClientSocketPoolBaseHelper::DoReleaseSocket(const std::string& group_name, |
| 472 ClientSocket* socket) { | 476 ClientSocket* socket) { |
| 477 // Running callbacks can cause the last outside reference to be released. |
| 478 // Hold onto a reference. |
| 479 scoped_refptr<ClientSocketPoolBaseHelper> ref_holder(this); |
| 480 |
| 473 GroupMap::iterator i = group_map_.find(group_name); | 481 GroupMap::iterator i = group_map_.find(group_name); |
| 474 CHECK(i != group_map_.end()); | 482 CHECK(i != group_map_.end()); |
| 475 | 483 |
| 476 Group& group = i->second; | 484 Group& group = i->second; |
| 477 | 485 |
| 478 group.num_releasing_sockets--; | 486 group.num_releasing_sockets--; |
| 479 DCHECK_GE(group.num_releasing_sockets, 0); | 487 DCHECK_GE(group.num_releasing_sockets, 0); |
| 480 | 488 |
| 481 CHECK_GT(handed_out_socket_count_, 0); | 489 CHECK_GT(handed_out_socket_count_, 0); |
| 482 handed_out_socket_count_--; | 490 handed_out_socket_count_--; |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 556 } | 564 } |
| 557 if (top_group) { | 565 if (top_group) { |
| 558 *group = top_group; | 566 *group = top_group; |
| 559 *group_name = *top_group_name; | 567 *group_name = *top_group_name; |
| 560 } | 568 } |
| 561 return stalled_group_count; | 569 return stalled_group_count; |
| 562 } | 570 } |
| 563 | 571 |
| 564 void ClientSocketPoolBaseHelper::OnConnectJobComplete( | 572 void ClientSocketPoolBaseHelper::OnConnectJobComplete( |
| 565 int result, ConnectJob* job) { | 573 int result, ConnectJob* job) { |
| 574 // Running callbacks can cause the last outside reference to be released. |
| 575 // Hold onto a reference. |
| 576 scoped_refptr<ClientSocketPoolBaseHelper> ref_holder(this); |
| 577 |
| 566 DCHECK_NE(ERR_IO_PENDING, result); | 578 DCHECK_NE(ERR_IO_PENDING, result); |
| 567 const std::string group_name = job->group_name(); | 579 const std::string group_name = job->group_name(); |
| 568 GroupMap::iterator group_it = group_map_.find(group_name); | 580 GroupMap::iterator group_it = group_map_.find(group_name); |
| 569 CHECK(group_it != group_map_.end()); | 581 CHECK(group_it != group_map_.end()); |
| 570 Group& group = group_it->second; | 582 Group& group = group_it->second; |
| 571 | 583 |
| 572 // We've had a connect on the socket; discard any pending backup job | 584 // We've had a connect on the socket; discard any pending backup job |
| 573 // for this group and kill the pending task. | 585 // for this group and kill the pending task. |
| 574 group.CleanupBackupJob(); | 586 group.CleanupBackupJob(); |
| 575 | 587 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 604 NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_ID, | 616 NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_ID, |
| 605 new NetLogIntegerParameter("source_id", job_log.source().id)); | 617 new NetLogIntegerParameter("source_id", job_log.source().id)); |
| 606 r->net_log().EndEvent(NetLog::TYPE_SOCKET_POOL, NULL); | 618 r->net_log().EndEvent(NetLog::TYPE_SOCKET_POOL, NULL); |
| 607 r->callback()->Run(result); | 619 r->callback()->Run(result); |
| 608 } | 620 } |
| 609 MaybeOnAvailableSocketSlot(group_name); | 621 MaybeOnAvailableSocketSlot(group_name); |
| 610 } | 622 } |
| 611 } | 623 } |
| 612 | 624 |
| 613 void ClientSocketPoolBaseHelper::OnIPAddressChanged() { | 625 void ClientSocketPoolBaseHelper::OnIPAddressChanged() { |
| 626 CancelAllConnectJobs(); |
| 614 CloseIdleSockets(); | 627 CloseIdleSockets(); |
| 615 } | 628 } |
| 616 | 629 |
| 617 void ClientSocketPoolBaseHelper::RemoveConnectJob(const ConnectJob *job, | 630 void ClientSocketPoolBaseHelper::RemoveConnectJob(const ConnectJob *job, |
| 618 Group* group) { | 631 Group* group) { |
| 619 CHECK_GT(connecting_socket_count_, 0); | 632 CHECK_GT(connecting_socket_count_, 0); |
| 620 connecting_socket_count_--; | 633 connecting_socket_count_--; |
| 621 | 634 |
| 622 DCHECK(job); | 635 DCHECK(job); |
| 623 delete job; | 636 delete job; |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 742 DCHECK_LE(total, max_sockets_); | 755 DCHECK_LE(total, max_sockets_); |
| 743 if (total < max_sockets_) | 756 if (total < max_sockets_) |
| 744 return false; | 757 return false; |
| 745 LOG(WARNING) << "ReachedMaxSocketsLimit: " << total << "/" << max_sockets_; | 758 LOG(WARNING) << "ReachedMaxSocketsLimit: " << total << "/" << max_sockets_; |
| 746 return true; | 759 return true; |
| 747 } | 760 } |
| 748 | 761 |
| 749 } // namespace internal | 762 } // namespace internal |
| 750 | 763 |
| 751 } // namespace net | 764 } // namespace net |
| OLD | NEW |