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 // A ClientSocketPoolBase is used to restrict the number of sockets open at | 5 // A ClientSocketPoolBase is used to restrict the number of sockets open at |
6 // a time. It also maintains a list of idle persistent sockets for reuse. | 6 // a time. It also maintains a list of idle persistent sockets for reuse. |
7 // Subclasses of ClientSocketPool should compose ClientSocketPoolBase to handle | 7 // Subclasses of ClientSocketPool should compose ClientSocketPoolBase to handle |
8 // the core logic of (1) restricting the number of active (connected or | 8 // the core logic of (1) restricting the number of active (connected or |
9 // connecting) sockets per "group" (generally speaking, the hostname), (2) | 9 // connecting) sockets per "group" (generally speaking, the hostname), (2) |
10 // maintaining a per-group list of idle, persistent sockets for reuse, and (3) | 10 // maintaining a per-group list of idle, persistent sockets for reuse, and (3) |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 class NET_EXPORT_PRIVATE ConnectJob { | 60 class NET_EXPORT_PRIVATE ConnectJob { |
61 public: | 61 public: |
62 class NET_EXPORT_PRIVATE Delegate { | 62 class NET_EXPORT_PRIVATE Delegate { |
63 public: | 63 public: |
64 Delegate() {} | 64 Delegate() {} |
65 virtual ~Delegate() {} | 65 virtual ~Delegate() {} |
66 | 66 |
67 // Alerts the delegate that the connection completed. |job| must | 67 // Alerts the delegate that the connection completed. |job| must |
68 // be destroyed by the delegate. A scoped_ptr<> isn't used because | 68 // be destroyed by the delegate. A scoped_ptr<> isn't used because |
69 // the caller of this function doesn't own |job|. | 69 // the caller of this function doesn't own |job|. |
70 virtual void OnConnectJobComplete(int result, | 70 virtual void OnConnectJobComplete(int result, ConnectJob* job) = 0; |
71 ConnectJob* job) = 0; | |
72 | 71 |
73 private: | 72 private: |
74 DISALLOW_COPY_AND_ASSIGN(Delegate); | 73 DISALLOW_COPY_AND_ASSIGN(Delegate); |
75 }; | 74 }; |
76 | 75 |
77 // A |timeout_duration| of 0 corresponds to no timeout. | 76 // A |timeout_duration| of 0 corresponds to no timeout. |
78 ConnectJob(const std::string& group_name, | 77 ConnectJob(const std::string& group_name, |
79 base::TimeDelta timeout_duration, | 78 base::TimeDelta timeout_duration, |
80 RequestPriority priority, | 79 RequestPriority priority, |
81 Delegate* delegate, | 80 Delegate* delegate, |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
154 // ClientSocketPoolBaseHelper. This class is not for external use, please use | 153 // ClientSocketPoolBaseHelper. This class is not for external use, please use |
155 // ClientSocketPoolBase instead. | 154 // ClientSocketPoolBase instead. |
156 class NET_EXPORT_PRIVATE ClientSocketPoolBaseHelper | 155 class NET_EXPORT_PRIVATE ClientSocketPoolBaseHelper |
157 : public ConnectJob::Delegate, | 156 : public ConnectJob::Delegate, |
158 public NetworkChangeNotifier::IPAddressObserver { | 157 public NetworkChangeNotifier::IPAddressObserver { |
159 public: | 158 public: |
160 typedef uint32 Flags; | 159 typedef uint32 Flags; |
161 | 160 |
162 // Used to specify specific behavior for the ClientSocketPool. | 161 // Used to specify specific behavior for the ClientSocketPool. |
163 enum Flag { | 162 enum Flag { |
164 NORMAL = 0, // Normal behavior. | 163 NORMAL = 0, // Normal behavior. |
165 NO_IDLE_SOCKETS = 0x1, // Do not return an idle socket. Create a new one. | 164 NO_IDLE_SOCKETS = 0x1, // Do not return an idle socket. Create a new one. |
166 }; | 165 }; |
167 | 166 |
168 class NET_EXPORT_PRIVATE Request { | 167 class NET_EXPORT_PRIVATE Request { |
169 public: | 168 public: |
170 Request(ClientSocketHandle* handle, | 169 Request(ClientSocketHandle* handle, |
171 const CompletionCallback& callback, | 170 const CompletionCallback& callback, |
172 RequestPriority priority, | 171 RequestPriority priority, |
173 bool ignore_limits, | 172 bool ignore_limits, |
174 Flags flags, | 173 Flags flags, |
(...skipping 29 matching lines...) Expand all Loading... |
204 const std::string& group_name, | 203 const std::string& group_name, |
205 const Request& request, | 204 const Request& request, |
206 ConnectJob::Delegate* delegate) const = 0; | 205 ConnectJob::Delegate* delegate) const = 0; |
207 | 206 |
208 virtual base::TimeDelta ConnectionTimeout() const = 0; | 207 virtual base::TimeDelta ConnectionTimeout() const = 0; |
209 | 208 |
210 private: | 209 private: |
211 DISALLOW_COPY_AND_ASSIGN(ConnectJobFactory); | 210 DISALLOW_COPY_AND_ASSIGN(ConnectJobFactory); |
212 }; | 211 }; |
213 | 212 |
214 ClientSocketPoolBaseHelper( | 213 ClientSocketPoolBaseHelper(HigherLayeredPool* pool, |
215 HigherLayeredPool* pool, | 214 int max_sockets, |
216 int max_sockets, | 215 int max_sockets_per_group, |
217 int max_sockets_per_group, | 216 base::TimeDelta unused_idle_socket_timeout, |
218 base::TimeDelta unused_idle_socket_timeout, | 217 base::TimeDelta used_idle_socket_timeout, |
219 base::TimeDelta used_idle_socket_timeout, | 218 ConnectJobFactory* connect_job_factory); |
220 ConnectJobFactory* connect_job_factory); | |
221 | 219 |
222 virtual ~ClientSocketPoolBaseHelper(); | 220 virtual ~ClientSocketPoolBaseHelper(); |
223 | 221 |
224 // Adds a lower layered pool to |this|, and adds |this| as a higher layered | 222 // Adds a lower layered pool to |this|, and adds |this| as a higher layered |
225 // pool on top of |lower_pool|. | 223 // pool on top of |lower_pool|. |
226 void AddLowerLayeredPool(LowerLayeredPool* lower_pool); | 224 void AddLowerLayeredPool(LowerLayeredPool* lower_pool); |
227 | 225 |
228 // See LowerLayeredPool::IsStalled for documentation on this function. | 226 // See LowerLayeredPool::IsStalled for documentation on this function. |
229 bool IsStalled() const; | 227 bool IsStalled() const; |
230 | 228 |
231 // See LowerLayeredPool for documentation on these functions. It is expected | 229 // See LowerLayeredPool for documentation on these functions. It is expected |
232 // in the destructor that no higher layer pools remain. | 230 // in the destructor that no higher layer pools remain. |
233 void AddHigherLayeredPool(HigherLayeredPool* higher_pool); | 231 void AddHigherLayeredPool(HigherLayeredPool* higher_pool); |
234 void RemoveHigherLayeredPool(HigherLayeredPool* higher_pool); | 232 void RemoveHigherLayeredPool(HigherLayeredPool* higher_pool); |
235 | 233 |
236 // See ClientSocketPool::RequestSocket for documentation on this function. | 234 // See ClientSocketPool::RequestSocket for documentation on this function. |
237 int RequestSocket(const std::string& group_name, | 235 int RequestSocket(const std::string& group_name, |
238 scoped_ptr<const Request> request); | 236 scoped_ptr<const Request> request); |
239 | 237 |
240 // See ClientSocketPool::RequestSocket for documentation on this function. | 238 // See ClientSocketPool::RequestSocket for documentation on this function. |
241 void RequestSockets(const std::string& group_name, | 239 void RequestSockets(const std::string& group_name, |
242 const Request& request, | 240 const Request& request, |
243 int num_sockets); | 241 int num_sockets); |
244 | 242 |
245 // See ClientSocketPool::CancelRequest for documentation on this function. | 243 // See ClientSocketPool::CancelRequest for documentation on this function. |
246 void CancelRequest(const std::string& group_name, | 244 void CancelRequest(const std::string& group_name, ClientSocketHandle* handle); |
247 ClientSocketHandle* handle); | |
248 | 245 |
249 // See ClientSocketPool::ReleaseSocket for documentation on this function. | 246 // See ClientSocketPool::ReleaseSocket for documentation on this function. |
250 void ReleaseSocket(const std::string& group_name, | 247 void ReleaseSocket(const std::string& group_name, |
251 scoped_ptr<StreamSocket> socket, | 248 scoped_ptr<StreamSocket> socket, |
252 int id); | 249 int id); |
253 | 250 |
254 // See ClientSocketPool::FlushWithError for documentation on this function. | 251 // See ClientSocketPool::FlushWithError for documentation on this function. |
255 void FlushWithError(int error); | 252 void FlushWithError(int error); |
256 | 253 |
257 // See ClientSocketPool::CloseIdleSockets for documentation on this function. | 254 // See ClientSocketPool::CloseIdleSockets for documentation on this function. |
258 void CloseIdleSockets(); | 255 void CloseIdleSockets(); |
259 | 256 |
260 // See ClientSocketPool::IdleSocketCount() for documentation on this function. | 257 // See ClientSocketPool::IdleSocketCount() for documentation on this function. |
261 int idle_socket_count() const { | 258 int idle_socket_count() const { return idle_socket_count_; } |
262 return idle_socket_count_; | |
263 } | |
264 | 259 |
265 // See ClientSocketPool::IdleSocketCountInGroup() for documentation on this | 260 // See ClientSocketPool::IdleSocketCountInGroup() for documentation on this |
266 // function. | 261 // function. |
267 int IdleSocketCountInGroup(const std::string& group_name) const; | 262 int IdleSocketCountInGroup(const std::string& group_name) const; |
268 | 263 |
269 // See ClientSocketPool::GetLoadState() for documentation on this function. | 264 // See ClientSocketPool::GetLoadState() for documentation on this function. |
270 LoadState GetLoadState(const std::string& group_name, | 265 LoadState GetLoadState(const std::string& group_name, |
271 const ClientSocketHandle* handle) const; | 266 const ClientSocketHandle* handle) const; |
272 | 267 |
273 base::TimeDelta ConnectRetryInterval() const { | 268 base::TimeDelta ConnectRetryInterval() const { |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
364 // A Group is allocated per group_name when there are idle sockets or pending | 359 // A Group is allocated per group_name when there are idle sockets or pending |
365 // requests. Otherwise, the Group object is removed from the map. | 360 // requests. Otherwise, the Group object is removed from the map. |
366 // |active_socket_count| tracks the number of sockets held by clients. | 361 // |active_socket_count| tracks the number of sockets held by clients. |
367 class Group { | 362 class Group { |
368 public: | 363 public: |
369 Group(); | 364 Group(); |
370 ~Group(); | 365 ~Group(); |
371 | 366 |
372 bool IsEmpty() const { | 367 bool IsEmpty() const { |
373 return active_socket_count_ == 0 && idle_sockets_.empty() && | 368 return active_socket_count_ == 0 && idle_sockets_.empty() && |
374 jobs_.empty() && pending_requests_.empty(); | 369 jobs_.empty() && pending_requests_.empty(); |
375 } | 370 } |
376 | 371 |
377 bool HasAvailableSocketSlot(int max_sockets_per_group) const { | 372 bool HasAvailableSocketSlot(int max_sockets_per_group) const { |
378 return NumActiveSocketSlots() < max_sockets_per_group; | 373 return NumActiveSocketSlots() < max_sockets_per_group; |
379 } | 374 } |
380 | 375 |
381 int NumActiveSocketSlots() const { | 376 int NumActiveSocketSlots() const { |
382 return active_socket_count_ + static_cast<int>(jobs_.size()) + | 377 return active_socket_count_ + static_cast<int>(jobs_.size()) + |
383 static_cast<int>(idle_sockets_.size()); | 378 static_cast<int>(idle_sockets_.size()); |
384 } | 379 } |
385 | 380 |
386 bool IsStalledOnPoolMaxSockets(int max_sockets_per_group) const { | 381 bool IsStalledOnPoolMaxSockets(int max_sockets_per_group) const { |
387 return HasAvailableSocketSlot(max_sockets_per_group) && | 382 return HasAvailableSocketSlot(max_sockets_per_group) && |
388 pending_requests_.size() > jobs_.size(); | 383 pending_requests_.size() > jobs_.size(); |
389 } | 384 } |
390 | 385 |
391 // Returns the priority of the top of the pending request queue | 386 // Returns the priority of the top of the pending request queue |
392 // (which may be less than the maximum priority over the entire | 387 // (which may be less than the maximum priority over the entire |
393 // queue, due to how we prioritize requests with |ignore_limits| | 388 // queue, due to how we prioritize requests with |ignore_limits| |
394 // set over others). | 389 // set over others). |
395 RequestPriority TopPendingPriority() const { | 390 RequestPriority TopPendingPriority() const { |
396 // NOTE: FirstMax().value()->priority() is not the same as | 391 // NOTE: FirstMax().value()->priority() is not the same as |
397 // FirstMax().priority()! | 392 // FirstMax().priority()! |
398 return pending_requests_.FirstMax().value()->priority(); | 393 return pending_requests_.FirstMax().value()->priority(); |
399 } | 394 } |
400 | 395 |
401 // Set a timer to create a backup job if it takes too long to | 396 // Set a timer to create a backup job if it takes too long to |
402 // create one and if a timer isn't already running. | 397 // create one and if a timer isn't already running. |
403 void StartBackupJobTimer(const std::string& group_name, | 398 void StartBackupJobTimer(const std::string& group_name, |
404 ClientSocketPoolBaseHelper* pool); | 399 ClientSocketPoolBaseHelper* pool); |
405 | 400 |
406 bool BackupJobTimerIsRunning() const; | 401 bool BackupJobTimerIsRunning() const; |
407 | 402 |
408 // If there's a ConnectJob that's never been assigned to Request, | 403 // If there's a ConnectJob that's never been assigned to Request, |
409 // decrements |unassigned_job_count_| and returns true. | 404 // decrements |unassigned_job_count_| and returns true. |
410 // Otherwise, returns false. | 405 // Otherwise, returns false. |
411 bool TryToUseUnassignedConnectJob(); | 406 bool TryToUseUnassignedConnectJob(); |
412 | 407 |
413 void AddJob(scoped_ptr<ConnectJob> job, bool is_preconnect); | 408 void AddJob(scoped_ptr<ConnectJob> job, bool is_preconnect); |
414 // Remove |job| from this group, which must already own |job|. | 409 // Remove |job| from this group, which must already own |job|. |
415 void RemoveJob(ConnectJob* job); | 410 void RemoveJob(ConnectJob* job); |
416 void RemoveAllJobs(); | 411 void RemoveAllJobs(); |
417 | 412 |
418 bool has_pending_requests() const { | 413 bool has_pending_requests() const { return !pending_requests_.empty(); } |
419 return !pending_requests_.empty(); | |
420 } | |
421 | 414 |
422 size_t pending_request_count() const { | 415 size_t pending_request_count() const { return pending_requests_.size(); } |
423 return pending_requests_.size(); | |
424 } | |
425 | 416 |
426 // Gets (but does not remove) the next pending request. Returns | 417 // Gets (but does not remove) the next pending request. Returns |
427 // NULL if there are no pending requests. | 418 // NULL if there are no pending requests. |
428 const Request* GetNextPendingRequest() const; | 419 const Request* GetNextPendingRequest() const; |
429 | 420 |
430 // Returns true if there is a connect job for |handle|. | 421 // Returns true if there is a connect job for |handle|. |
431 bool HasConnectJobForHandle(const ClientSocketHandle* handle) const; | 422 bool HasConnectJobForHandle(const ClientSocketHandle* handle) const; |
432 | 423 |
433 // Inserts the request into the queue based on priority | 424 // Inserts the request into the queue based on priority |
434 // order. Older requests are prioritized over requests of equal | 425 // order. Older requests are prioritized over requests of equal |
(...skipping 18 matching lines...) Expand all Loading... |
453 int active_socket_count() const { return active_socket_count_; } | 444 int active_socket_count() const { return active_socket_count_; } |
454 std::list<IdleSocket>* mutable_idle_sockets() { return &idle_sockets_; } | 445 std::list<IdleSocket>* mutable_idle_sockets() { return &idle_sockets_; } |
455 | 446 |
456 private: | 447 private: |
457 // Returns the iterator's pending request after removing it from | 448 // Returns the iterator's pending request after removing it from |
458 // the queue. | 449 // the queue. |
459 scoped_ptr<const Request> RemovePendingRequest( | 450 scoped_ptr<const Request> RemovePendingRequest( |
460 const RequestQueue::Pointer& pointer); | 451 const RequestQueue::Pointer& pointer); |
461 | 452 |
462 // Called when the backup socket timer fires. | 453 // Called when the backup socket timer fires. |
463 void OnBackupJobTimerFired( | 454 void OnBackupJobTimerFired(std::string group_name, |
464 std::string group_name, | 455 ClientSocketPoolBaseHelper* pool); |
465 ClientSocketPoolBaseHelper* pool); | |
466 | 456 |
467 // Checks that |unassigned_job_count_| does not execeed the number of | 457 // Checks that |unassigned_job_count_| does not execeed the number of |
468 // ConnectJobs. | 458 // ConnectJobs. |
469 void SanityCheck(); | 459 void SanityCheck(); |
470 | 460 |
471 // Total number of ConnectJobs that have never been assigned to a Request. | 461 // Total number of ConnectJobs that have never been assigned to a Request. |
472 // Since jobs use late binding to requests, which ConnectJobs have or have | 462 // Since jobs use late binding to requests, which ConnectJobs have or have |
473 // not been assigned to a request are not tracked. This is incremented on | 463 // not been assigned to a request are not tracked. This is incremented on |
474 // preconnect and decremented when a preconnect is assigned, or when there | 464 // preconnect and decremented when a preconnect is assigned, or when there |
475 // are fewer than |unassigned_job_count_| ConnectJobs. Not incremented | 465 // are fewer than |unassigned_job_count_| ConnectJobs. Not incremented |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
512 void StartIdleSocketTimer(); | 502 void StartIdleSocketTimer(); |
513 | 503 |
514 // Scans the group map for groups which have an available socket slot and | 504 // Scans the group map for groups which have an available socket slot and |
515 // at least one pending request. Returns true if any groups are stalled, and | 505 // at least one pending request. Returns true if any groups are stalled, and |
516 // if so (and if both |group| and |group_name| are not NULL), fills |group| | 506 // if so (and if both |group| and |group_name| are not NULL), fills |group| |
517 // and |group_name| with data of the stalled group having highest priority. | 507 // and |group_name| with data of the stalled group having highest priority. |
518 bool FindTopStalledGroup(Group** group, std::string* group_name) const; | 508 bool FindTopStalledGroup(Group** group, std::string* group_name) const; |
519 | 509 |
520 // Called when timer_ fires. This method scans the idle sockets removing | 510 // Called when timer_ fires. This method scans the idle sockets removing |
521 // sockets that timed out or can't be reused. | 511 // sockets that timed out or can't be reused. |
522 void OnCleanupTimerFired() { | 512 void OnCleanupTimerFired() { CleanupIdleSockets(false); } |
523 CleanupIdleSockets(false); | |
524 } | |
525 | 513 |
526 // Removes |job| from |group|, which must already own |job|. | 514 // Removes |job| from |group|, which must already own |job|. |
527 void RemoveConnectJob(ConnectJob* job, Group* group); | 515 void RemoveConnectJob(ConnectJob* job, Group* group); |
528 | 516 |
529 // Tries to see if we can handle any more requests for |group|. | 517 // Tries to see if we can handle any more requests for |group|. |
530 void OnAvailableSocketSlot(const std::string& group_name, Group* group); | 518 void OnAvailableSocketSlot(const std::string& group_name, Group* group); |
531 | 519 |
532 // Process a pending socket request for a group. | 520 // Process a pending socket request for a group. |
533 void ProcessPendingRequest(const std::string& group_name, Group* group); | 521 void ProcessPendingRequest(const std::string& group_name, Group* group); |
534 | 522 |
(...skipping 24 matching lines...) Expand all Loading... |
559 // it does not handle logging into NetLog of the queueing status of | 547 // it does not handle logging into NetLog of the queueing status of |
560 // |request|. | 548 // |request|. |
561 int RequestSocketInternal(const std::string& group_name, | 549 int RequestSocketInternal(const std::string& group_name, |
562 const Request& request); | 550 const Request& request); |
563 | 551 |
564 // Assigns an idle socket for the group to the request. | 552 // Assigns an idle socket for the group to the request. |
565 // Returns |true| if an idle socket is available, false otherwise. | 553 // Returns |true| if an idle socket is available, false otherwise. |
566 bool AssignIdleSocketToRequest(const Request& request, Group* group); | 554 bool AssignIdleSocketToRequest(const Request& request, Group* group); |
567 | 555 |
568 static void LogBoundConnectJobToRequest( | 556 static void LogBoundConnectJobToRequest( |
569 const NetLog::Source& connect_job_source, const Request& request); | 557 const NetLog::Source& connect_job_source, |
| 558 const Request& request); |
570 | 559 |
571 // Same as CloseOneIdleSocket() except it won't close an idle socket in | 560 // Same as CloseOneIdleSocket() except it won't close an idle socket in |
572 // |group|. If |group| is NULL, it is ignored. Returns true if it closed a | 561 // |group|. If |group| is NULL, it is ignored. Returns true if it closed a |
573 // socket. | 562 // socket. |
574 bool CloseOneIdleSocketExceptInGroup(const Group* group); | 563 bool CloseOneIdleSocketExceptInGroup(const Group* group); |
575 | 564 |
576 // Checks if there are stalled socket groups that should be notified | 565 // Checks if there are stalled socket groups that should be notified |
577 // for possible wakeup. | 566 // for possible wakeup. |
578 void CheckForStalledSocketGroups(); | 567 void CheckForStalledSocketGroups(); |
579 | 568 |
580 // Posts a task to call InvokeUserCallback() on the next iteration through the | 569 // Posts a task to call InvokeUserCallback() on the next iteration through the |
581 // current message loop. Inserts |callback| into |pending_callback_map_|, | 570 // current message loop. Inserts |callback| into |pending_callback_map_|, |
582 // keyed by |handle|. | 571 // keyed by |handle|. |
583 void InvokeUserCallbackLater( | 572 void InvokeUserCallbackLater(ClientSocketHandle* handle, |
584 ClientSocketHandle* handle, const CompletionCallback& callback, int rv); | 573 const CompletionCallback& callback, |
| 574 int rv); |
585 | 575 |
586 // Invokes the user callback for |handle|. By the time this task has run, | 576 // Invokes the user callback for |handle|. By the time this task has run, |
587 // it's possible that the request has been cancelled, so |handle| may not | 577 // it's possible that the request has been cancelled, so |handle| may not |
588 // exist in |pending_callback_map_|. We look up the callback and result code | 578 // exist in |pending_callback_map_|. We look up the callback and result code |
589 // in |pending_callback_map_|. | 579 // in |pending_callback_map_|. |
590 void InvokeUserCallback(ClientSocketHandle* handle); | 580 void InvokeUserCallback(ClientSocketHandle* handle); |
591 | 581 |
592 // Tries to close idle sockets in a higher level socket pool as long as this | 582 // Tries to close idle sockets in a higher level socket pool as long as this |
593 // this pool is stalled. | 583 // this pool is stalled. |
594 void TryToCloseSocketsInLayeredPools(); | 584 void TryToCloseSocketsInLayeredPools(); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
661 public: | 651 public: |
662 class Request : public internal::ClientSocketPoolBaseHelper::Request { | 652 class Request : public internal::ClientSocketPoolBaseHelper::Request { |
663 public: | 653 public: |
664 Request(ClientSocketHandle* handle, | 654 Request(ClientSocketHandle* handle, |
665 const CompletionCallback& callback, | 655 const CompletionCallback& callback, |
666 RequestPriority priority, | 656 RequestPriority priority, |
667 internal::ClientSocketPoolBaseHelper::Flags flags, | 657 internal::ClientSocketPoolBaseHelper::Flags flags, |
668 bool ignore_limits, | 658 bool ignore_limits, |
669 const scoped_refptr<SocketParams>& params, | 659 const scoped_refptr<SocketParams>& params, |
670 const BoundNetLog& net_log) | 660 const BoundNetLog& net_log) |
671 : internal::ClientSocketPoolBaseHelper::Request( | 661 : internal::ClientSocketPoolBaseHelper::Request(handle, |
672 handle, callback, priority, ignore_limits, flags, net_log), | 662 callback, |
| 663 priority, |
| 664 ignore_limits, |
| 665 flags, |
| 666 net_log), |
673 params_(params) {} | 667 params_(params) {} |
674 | 668 |
675 const scoped_refptr<SocketParams>& params() const { return params_; } | 669 const scoped_refptr<SocketParams>& params() const { return params_; } |
676 | 670 |
677 private: | 671 private: |
678 const scoped_refptr<SocketParams> params_; | 672 const scoped_refptr<SocketParams> params_; |
679 }; | 673 }; |
680 | 674 |
681 class ConnectJobFactory { | 675 class ConnectJobFactory { |
682 public: | 676 public: |
(...skipping 10 matching lines...) Expand all Loading... |
693 private: | 687 private: |
694 DISALLOW_COPY_AND_ASSIGN(ConnectJobFactory); | 688 DISALLOW_COPY_AND_ASSIGN(ConnectJobFactory); |
695 }; | 689 }; |
696 | 690 |
697 // |max_sockets| is the maximum number of sockets to be maintained by this | 691 // |max_sockets| is the maximum number of sockets to be maintained by this |
698 // ClientSocketPool. |max_sockets_per_group| specifies the maximum number of | 692 // ClientSocketPool. |max_sockets_per_group| specifies the maximum number of |
699 // sockets a "group" can have. |unused_idle_socket_timeout| specifies how | 693 // sockets a "group" can have. |unused_idle_socket_timeout| specifies how |
700 // long to leave an unused idle socket open before closing it. | 694 // long to leave an unused idle socket open before closing it. |
701 // |used_idle_socket_timeout| specifies how long to leave a previously used | 695 // |used_idle_socket_timeout| specifies how long to leave a previously used |
702 // idle socket open before closing it. | 696 // idle socket open before closing it. |
703 ClientSocketPoolBase( | 697 ClientSocketPoolBase(HigherLayeredPool* self, |
704 HigherLayeredPool* self, | 698 int max_sockets, |
705 int max_sockets, | 699 int max_sockets_per_group, |
706 int max_sockets_per_group, | 700 ClientSocketPoolHistograms* histograms, |
707 ClientSocketPoolHistograms* histograms, | 701 base::TimeDelta unused_idle_socket_timeout, |
708 base::TimeDelta unused_idle_socket_timeout, | 702 base::TimeDelta used_idle_socket_timeout, |
709 base::TimeDelta used_idle_socket_timeout, | 703 ConnectJobFactory* connect_job_factory) |
710 ConnectJobFactory* connect_job_factory) | |
711 : histograms_(histograms), | 704 : histograms_(histograms), |
712 helper_(self, max_sockets, max_sockets_per_group, | 705 helper_(self, |
713 unused_idle_socket_timeout, used_idle_socket_timeout, | 706 max_sockets, |
| 707 max_sockets_per_group, |
| 708 unused_idle_socket_timeout, |
| 709 used_idle_socket_timeout, |
714 new ConnectJobFactoryAdaptor(connect_job_factory)) {} | 710 new ConnectJobFactoryAdaptor(connect_job_factory)) {} |
715 | 711 |
716 virtual ~ClientSocketPoolBase() {} | 712 virtual ~ClientSocketPoolBase() {} |
717 | 713 |
718 // These member functions simply forward to ClientSocketPoolBaseHelper. | 714 // These member functions simply forward to ClientSocketPoolBaseHelper. |
719 void AddLowerLayeredPool(LowerLayeredPool* lower_pool) { | 715 void AddLowerLayeredPool(LowerLayeredPool* lower_pool) { |
720 helper_.AddLowerLayeredPool(lower_pool); | 716 helper_.AddLowerLayeredPool(lower_pool); |
721 } | 717 } |
722 | 718 |
723 void AddHigherLayeredPool(HigherLayeredPool* higher_pool) { | 719 void AddHigherLayeredPool(HigherLayeredPool* higher_pool) { |
724 helper_.AddHigherLayeredPool(higher_pool); | 720 helper_.AddHigherLayeredPool(higher_pool); |
725 } | 721 } |
726 | 722 |
727 void RemoveHigherLayeredPool(HigherLayeredPool* higher_pool) { | 723 void RemoveHigherLayeredPool(HigherLayeredPool* higher_pool) { |
728 helper_.RemoveHigherLayeredPool(higher_pool); | 724 helper_.RemoveHigherLayeredPool(higher_pool); |
729 } | 725 } |
730 | 726 |
731 // RequestSocket bundles up the parameters into a Request and then forwards to | 727 // RequestSocket bundles up the parameters into a Request and then forwards to |
732 // ClientSocketPoolBaseHelper::RequestSocket(). | 728 // ClientSocketPoolBaseHelper::RequestSocket(). |
733 int RequestSocket(const std::string& group_name, | 729 int RequestSocket(const std::string& group_name, |
734 const scoped_refptr<SocketParams>& params, | 730 const scoped_refptr<SocketParams>& params, |
735 RequestPriority priority, | 731 RequestPriority priority, |
736 ClientSocketHandle* handle, | 732 ClientSocketHandle* handle, |
737 const CompletionCallback& callback, | 733 const CompletionCallback& callback, |
738 const BoundNetLog& net_log) { | 734 const BoundNetLog& net_log) { |
739 scoped_ptr<const Request> request( | 735 scoped_ptr<const Request> request( |
740 new Request(handle, callback, priority, | 736 new Request(handle, |
| 737 callback, |
| 738 priority, |
741 internal::ClientSocketPoolBaseHelper::NORMAL, | 739 internal::ClientSocketPoolBaseHelper::NORMAL, |
742 params->ignore_limits(), | 740 params->ignore_limits(), |
743 params, net_log)); | 741 params, |
| 742 net_log)); |
744 return helper_.RequestSocket( | 743 return helper_.RequestSocket( |
745 group_name, | 744 group_name, |
746 request.template PassAs< | 745 request.template PassAs< |
747 const internal::ClientSocketPoolBaseHelper::Request>()); | 746 const internal::ClientSocketPoolBaseHelper::Request>()); |
748 } | 747 } |
749 | 748 |
750 // RequestSockets bundles up the parameters into a Request and then forwards | 749 // RequestSockets bundles up the parameters into a Request and then forwards |
751 // to ClientSocketPoolBaseHelper::RequestSockets(). Note that it assigns the | 750 // to ClientSocketPoolBaseHelper::RequestSockets(). Note that it assigns the |
752 // priority to DEFAULT_PRIORITY and specifies the NO_IDLE_SOCKETS flag. | 751 // priority to DEFAULT_PRIORITY and specifies the NO_IDLE_SOCKETS flag. |
753 void RequestSockets(const std::string& group_name, | 752 void RequestSockets(const std::string& group_name, |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
818 | 817 |
819 base::DictionaryValue* GetInfoAsValue(const std::string& name, | 818 base::DictionaryValue* GetInfoAsValue(const std::string& name, |
820 const std::string& type) const { | 819 const std::string& type) const { |
821 return helper_.GetInfoAsValue(name, type); | 820 return helper_.GetInfoAsValue(name, type); |
822 } | 821 } |
823 | 822 |
824 base::TimeDelta ConnectionTimeout() const { | 823 base::TimeDelta ConnectionTimeout() const { |
825 return helper_.ConnectionTimeout(); | 824 return helper_.ConnectionTimeout(); |
826 } | 825 } |
827 | 826 |
828 ClientSocketPoolHistograms* histograms() const { | 827 ClientSocketPoolHistograms* histograms() const { return histograms_; } |
829 return histograms_; | |
830 } | |
831 | 828 |
832 void EnableConnectBackupJobs() { helper_.EnableConnectBackupJobs(); } | 829 void EnableConnectBackupJobs() { helper_.EnableConnectBackupJobs(); } |
833 | 830 |
834 bool CloseOneIdleSocket() { return helper_.CloseOneIdleSocket(); } | 831 bool CloseOneIdleSocket() { return helper_.CloseOneIdleSocket(); } |
835 | 832 |
836 bool CloseOneIdleConnectionInHigherLayeredPool() { | 833 bool CloseOneIdleConnectionInHigherLayeredPool() { |
837 return helper_.CloseOneIdleConnectionInHigherLayeredPool(); | 834 return helper_.CloseOneIdleConnectionInHigherLayeredPool(); |
838 } | 835 } |
839 | 836 |
840 private: | 837 private: |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
872 // Histograms for the pool | 869 // Histograms for the pool |
873 ClientSocketPoolHistograms* const histograms_; | 870 ClientSocketPoolHistograms* const histograms_; |
874 internal::ClientSocketPoolBaseHelper helper_; | 871 internal::ClientSocketPoolBaseHelper helper_; |
875 | 872 |
876 DISALLOW_COPY_AND_ASSIGN(ClientSocketPoolBase); | 873 DISALLOW_COPY_AND_ASSIGN(ClientSocketPoolBase); |
877 }; | 874 }; |
878 | 875 |
879 } // namespace net | 876 } // namespace net |
880 | 877 |
881 #endif // NET_SOCKET_CLIENT_SOCKET_POOL_BASE_H_ | 878 #endif // NET_SOCKET_CLIENT_SOCKET_POOL_BASE_H_ |
OLD | NEW |