OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/websocket_transport_client_socket_pool.h" | 5 #include "net/socket/websocket_transport_client_socket_pool.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <utility> |
8 | 9 |
9 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" |
10 #include "base/location.h" | 11 #include "base/location.h" |
11 #include "base/logging.h" | 12 #include "base/logging.h" |
12 #include "base/numerics/safe_conversions.h" | 13 #include "base/numerics/safe_conversions.h" |
13 #include "base/single_thread_task_runner.h" | 14 #include "base/single_thread_task_runner.h" |
14 #include "base/strings/string_util.h" | 15 #include "base/strings/string_util.h" |
15 #include "base/thread_task_runner_handle.h" | 16 #include "base/thread_task_runner_handle.h" |
16 #include "base/time/time.h" | 17 #include "base/time/time.h" |
17 #include "base/values.h" | 18 #include "base/values.h" |
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
325 NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB, | 326 NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB, |
326 connect_job->net_log().source().ToEventParametersCallback()); | 327 connect_job->net_log().source().ToEventParametersCallback()); |
327 if (rv == OK) { | 328 if (rv == OK) { |
328 HandOutSocket(connect_job->PassSocket(), | 329 HandOutSocket(connect_job->PassSocket(), |
329 connect_job->connect_timing(), | 330 connect_job->connect_timing(), |
330 handle, | 331 handle, |
331 request_net_log); | 332 request_net_log); |
332 request_net_log.EndEvent(NetLog::TYPE_SOCKET_POOL); | 333 request_net_log.EndEvent(NetLog::TYPE_SOCKET_POOL); |
333 } else if (rv == ERR_IO_PENDING) { | 334 } else if (rv == ERR_IO_PENDING) { |
334 // TODO(ricea): Implement backup job timer? | 335 // TODO(ricea): Implement backup job timer? |
335 AddJob(handle, connect_job.Pass()); | 336 AddJob(handle, std::move(connect_job)); |
336 } else { | 337 } else { |
337 scoped_ptr<StreamSocket> error_socket; | 338 scoped_ptr<StreamSocket> error_socket; |
338 connect_job->GetAdditionalErrorState(handle); | 339 connect_job->GetAdditionalErrorState(handle); |
339 error_socket = connect_job->PassSocket(); | 340 error_socket = connect_job->PassSocket(); |
340 if (error_socket) { | 341 if (error_socket) { |
341 HandOutSocket(error_socket.Pass(), | 342 HandOutSocket(std::move(error_socket), connect_job->connect_timing(), |
342 connect_job->connect_timing(), | 343 handle, request_net_log); |
343 handle, | |
344 request_net_log); | |
345 } | 344 } |
346 } | 345 } |
347 | 346 |
348 if (rv != ERR_IO_PENDING) { | 347 if (rv != ERR_IO_PENDING) { |
349 request_net_log.EndEventWithNetErrorCode(NetLog::TYPE_SOCKET_POOL, rv); | 348 request_net_log.EndEventWithNetErrorCode(NetLog::TYPE_SOCKET_POOL, rv); |
350 } | 349 } |
351 | 350 |
352 return rv; | 351 return rv; |
353 } | 352 } |
354 | 353 |
355 void WebSocketTransportClientSocketPool::RequestSockets( | 354 void WebSocketTransportClientSocketPool::RequestSockets( |
356 const std::string& group_name, | 355 const std::string& group_name, |
357 const void* params, | 356 const void* params, |
358 int num_sockets, | 357 int num_sockets, |
359 const BoundNetLog& net_log) { | 358 const BoundNetLog& net_log) { |
360 NOTIMPLEMENTED(); | 359 NOTIMPLEMENTED(); |
361 } | 360 } |
362 | 361 |
363 void WebSocketTransportClientSocketPool::CancelRequest( | 362 void WebSocketTransportClientSocketPool::CancelRequest( |
364 const std::string& group_name, | 363 const std::string& group_name, |
365 ClientSocketHandle* handle) { | 364 ClientSocketHandle* handle) { |
366 DCHECK(!handle->is_initialized()); | 365 DCHECK(!handle->is_initialized()); |
367 if (DeleteStalledRequest(handle)) | 366 if (DeleteStalledRequest(handle)) |
368 return; | 367 return; |
369 scoped_ptr<StreamSocket> socket = handle->PassSocket(); | 368 scoped_ptr<StreamSocket> socket = handle->PassSocket(); |
370 if (socket) | 369 if (socket) |
371 ReleaseSocket(handle->group_name(), socket.Pass(), handle->id()); | 370 ReleaseSocket(handle->group_name(), std::move(socket), handle->id()); |
372 if (!DeleteJob(handle)) | 371 if (!DeleteJob(handle)) |
373 pending_callbacks_.erase(handle); | 372 pending_callbacks_.erase(handle); |
374 if (!ReachedMaxSocketsLimit() && !stalled_request_queue_.empty()) | 373 if (!ReachedMaxSocketsLimit() && !stalled_request_queue_.empty()) |
375 ActivateStalledRequest(); | 374 ActivateStalledRequest(); |
376 } | 375 } |
377 | 376 |
378 void WebSocketTransportClientSocketPool::ReleaseSocket( | 377 void WebSocketTransportClientSocketPool::ReleaseSocket( |
379 const std::string& group_name, | 378 const std::string& group_name, |
380 scoped_ptr<StreamSocket> socket, | 379 scoped_ptr<StreamSocket> socket, |
381 int id) { | 380 int id) { |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
442 bool include_nested_pools) const { | 441 bool include_nested_pools) const { |
443 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 442 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
444 dict->SetString("name", name); | 443 dict->SetString("name", name); |
445 dict->SetString("type", type); | 444 dict->SetString("type", type); |
446 dict->SetInteger("handed_out_socket_count", handed_out_socket_count_); | 445 dict->SetInteger("handed_out_socket_count", handed_out_socket_count_); |
447 dict->SetInteger("connecting_socket_count", pending_connects_.size()); | 446 dict->SetInteger("connecting_socket_count", pending_connects_.size()); |
448 dict->SetInteger("idle_socket_count", 0); | 447 dict->SetInteger("idle_socket_count", 0); |
449 dict->SetInteger("max_socket_count", max_sockets_); | 448 dict->SetInteger("max_socket_count", max_sockets_); |
450 dict->SetInteger("max_sockets_per_group", max_sockets_); | 449 dict->SetInteger("max_sockets_per_group", max_sockets_); |
451 dict->SetInteger("pool_generation_number", 0); | 450 dict->SetInteger("pool_generation_number", 0); |
452 return dict.Pass(); | 451 return dict; |
453 } | 452 } |
454 | 453 |
455 TimeDelta WebSocketTransportClientSocketPool::ConnectionTimeout() const { | 454 TimeDelta WebSocketTransportClientSocketPool::ConnectionTimeout() const { |
456 return TimeDelta::FromSeconds(kTransportConnectJobTimeoutInSeconds); | 455 return TimeDelta::FromSeconds(kTransportConnectJobTimeoutInSeconds); |
457 } | 456 } |
458 | 457 |
459 bool WebSocketTransportClientSocketPool::IsStalled() const { | 458 bool WebSocketTransportClientSocketPool::IsStalled() const { |
460 return !stalled_request_queue_.empty(); | 459 return !stalled_request_queue_.empty(); |
461 } | 460 } |
462 | 461 |
(...skipping 13 matching lines...) Expand all Loading... |
476 BoundNetLog request_net_log = job->request_net_log(); | 475 BoundNetLog request_net_log = job->request_net_log(); |
477 CompletionCallback callback = job->callback(); | 476 CompletionCallback callback = job->callback(); |
478 LoadTimingInfo::ConnectTiming connect_timing = job->connect_timing(); | 477 LoadTimingInfo::ConnectTiming connect_timing = job->connect_timing(); |
479 | 478 |
480 ClientSocketHandle* const handle = job->handle(); | 479 ClientSocketHandle* const handle = job->handle(); |
481 bool handed_out_socket = false; | 480 bool handed_out_socket = false; |
482 | 481 |
483 if (result == OK) { | 482 if (result == OK) { |
484 DCHECK(socket.get()); | 483 DCHECK(socket.get()); |
485 handed_out_socket = true; | 484 handed_out_socket = true; |
486 HandOutSocket(socket.Pass(), connect_timing, handle, request_net_log); | 485 HandOutSocket(std::move(socket), connect_timing, handle, request_net_log); |
487 request_net_log.EndEvent(NetLog::TYPE_SOCKET_POOL); | 486 request_net_log.EndEvent(NetLog::TYPE_SOCKET_POOL); |
488 } else { | 487 } else { |
489 // If we got a socket, it must contain error information so pass that | 488 // If we got a socket, it must contain error information so pass that |
490 // up so that the caller can retrieve it. | 489 // up so that the caller can retrieve it. |
491 job->GetAdditionalErrorState(handle); | 490 job->GetAdditionalErrorState(handle); |
492 if (socket.get()) { | 491 if (socket.get()) { |
493 handed_out_socket = true; | 492 handed_out_socket = true; |
494 HandOutSocket(socket.Pass(), connect_timing, handle, request_net_log); | 493 HandOutSocket(std::move(socket), connect_timing, handle, request_net_log); |
495 } | 494 } |
496 request_net_log.EndEventWithNetErrorCode(NetLog::TYPE_SOCKET_POOL, result); | 495 request_net_log.EndEventWithNetErrorCode(NetLog::TYPE_SOCKET_POOL, result); |
497 } | 496 } |
498 bool delete_succeeded = DeleteJob(handle); | 497 bool delete_succeeded = DeleteJob(handle); |
499 DCHECK(delete_succeeded); | 498 DCHECK(delete_succeeded); |
500 if (!handed_out_socket && !stalled_request_queue_.empty() && | 499 if (!handed_out_socket && !stalled_request_queue_.empty() && |
501 !ReachedMaxSocketsLimit()) | 500 !ReachedMaxSocketsLimit()) |
502 ActivateStalledRequest(); | 501 ActivateStalledRequest(); |
503 InvokeUserCallbackLater(handle, callback, result); | 502 InvokeUserCallbackLater(handle, callback, result); |
504 } | 503 } |
(...skipping 23 matching lines...) Expand all Loading... |
528 base::checked_cast<int>(pending_connects_.size()) >= | 527 base::checked_cast<int>(pending_connects_.size()) >= |
529 max_sockets_ - handed_out_socket_count_; | 528 max_sockets_ - handed_out_socket_count_; |
530 } | 529 } |
531 | 530 |
532 void WebSocketTransportClientSocketPool::HandOutSocket( | 531 void WebSocketTransportClientSocketPool::HandOutSocket( |
533 scoped_ptr<StreamSocket> socket, | 532 scoped_ptr<StreamSocket> socket, |
534 const LoadTimingInfo::ConnectTiming& connect_timing, | 533 const LoadTimingInfo::ConnectTiming& connect_timing, |
535 ClientSocketHandle* handle, | 534 ClientSocketHandle* handle, |
536 const BoundNetLog& net_log) { | 535 const BoundNetLog& net_log) { |
537 DCHECK(socket); | 536 DCHECK(socket); |
538 handle->SetSocket(socket.Pass()); | 537 handle->SetSocket(std::move(socket)); |
539 DCHECK_EQ(ClientSocketHandle::UNUSED, handle->reuse_type()); | 538 DCHECK_EQ(ClientSocketHandle::UNUSED, handle->reuse_type()); |
540 DCHECK_EQ(0, handle->idle_time().InMicroseconds()); | 539 DCHECK_EQ(0, handle->idle_time().InMicroseconds()); |
541 handle->set_pool_id(0); | 540 handle->set_pool_id(0); |
542 handle->set_connect_timing(connect_timing); | 541 handle->set_connect_timing(connect_timing); |
543 | 542 |
544 net_log.AddEvent( | 543 net_log.AddEvent( |
545 NetLog::TYPE_SOCKET_POOL_BOUND_TO_SOCKET, | 544 NetLog::TYPE_SOCKET_POOL_BOUND_TO_SOCKET, |
546 handle->socket()->NetLog().source().ToEventParametersCallback()); | 545 handle->socket()->NetLog().source().ToEventParametersCallback()); |
547 | 546 |
548 ++handed_out_socket_count_; | 547 ++handed_out_socket_count_; |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
635 const BoundNetLog& net_log) | 634 const BoundNetLog& net_log) |
636 : params(params), | 635 : params(params), |
637 priority(priority), | 636 priority(priority), |
638 handle(handle), | 637 handle(handle), |
639 callback(callback), | 638 callback(callback), |
640 net_log(net_log) {} | 639 net_log(net_log) {} |
641 | 640 |
642 WebSocketTransportClientSocketPool::StalledRequest::~StalledRequest() {} | 641 WebSocketTransportClientSocketPool::StalledRequest::~StalledRequest() {} |
643 | 642 |
644 } // namespace net | 643 } // namespace net |
OLD | NEW |