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_handle.h" | 5 #include "net/socket/client_socket_handle.h" |
6 | 6 |
7 #include "base/compiler_specific.h" | 7 #include "base/compiler_specific.h" |
8 #include "base/histogram.h" | 8 #include "base/histogram.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "net/base/net_errors.h" | 10 #include "net/base/net_errors.h" |
(...skipping 19 matching lines...) Expand all Loading... |
30 void ClientSocketHandle::ResetInternal(bool cancel) { | 30 void ClientSocketHandle::ResetInternal(bool cancel) { |
31 if (group_name_.empty()) // Was Init called? | 31 if (group_name_.empty()) // Was Init called? |
32 return; | 32 return; |
33 if (socket_.get()) { | 33 if (socket_.get()) { |
34 // Because of http://crbug.com/37810 we may not have a pool, but have | 34 // Because of http://crbug.com/37810 we may not have a pool, but have |
35 // just a raw socket. | 35 // just a raw socket. |
36 socket_->NetLog().EndEvent(NetLog::TYPE_SOCKET_IN_USE, NULL); | 36 socket_->NetLog().EndEvent(NetLog::TYPE_SOCKET_IN_USE, NULL); |
37 if (pool_) | 37 if (pool_) |
38 // If we've still got a socket, release it back to the ClientSocketPool so | 38 // If we've still got a socket, release it back to the ClientSocketPool so |
39 // it can be deleted or reused. | 39 // it can be deleted or reused. |
40 pool_->ReleaseSocket(group_name_, release_socket()); | 40 pool_->ReleaseSocket(group_name_, release_socket(), pool_id_); |
41 } else if (cancel) { | 41 } else if (cancel) { |
42 // If we did not get initialized yet, so we've got a socket request pending. | 42 // If we did not get initialized yet, so we've got a socket request pending. |
43 // Cancel it. | 43 // Cancel it. |
44 pool_->CancelRequest(group_name_, this); | 44 pool_->CancelRequest(group_name_, this); |
45 } | 45 } |
46 group_name_.clear(); | 46 group_name_.clear(); |
47 is_reused_ = false; | 47 is_reused_ = false; |
48 user_callback_ = NULL; | 48 user_callback_ = NULL; |
49 pool_ = NULL; | 49 pool_ = NULL; |
50 idle_time_ = base::TimeDelta(); | 50 idle_time_ = base::TimeDelta(); |
51 init_time_ = base::TimeTicks(); | 51 init_time_ = base::TimeTicks(); |
52 setup_time_ = base::TimeDelta(); | 52 setup_time_ = base::TimeDelta(); |
| 53 pool_id_ = -1; |
53 } | 54 } |
54 | 55 |
55 LoadState ClientSocketHandle::GetLoadState() const { | 56 LoadState ClientSocketHandle::GetLoadState() const { |
56 CHECK(!is_initialized()); | 57 CHECK(!is_initialized()); |
57 CHECK(!group_name_.empty()); | 58 CHECK(!group_name_.empty()); |
58 // Because of http://crbug.com/37810 we may not have a pool, but have | 59 // Because of http://crbug.com/37810 we may not have a pool, but have |
59 // just a raw socket. | 60 // just a raw socket. |
60 if (!pool_) | 61 if (!pool_) |
61 return LOAD_STATE_IDLE; | 62 return LOAD_STATE_IDLE; |
62 return pool_->GetLoadState(group_name_, this); | 63 return pool_->GetLoadState(group_name_, this); |
63 } | 64 } |
64 | 65 |
65 void ClientSocketHandle::OnIOComplete(int result) { | 66 void ClientSocketHandle::OnIOComplete(int result) { |
66 CompletionCallback* callback = user_callback_; | 67 CompletionCallback* callback = user_callback_; |
67 user_callback_ = NULL; | 68 user_callback_ = NULL; |
68 HandleInitCompletion(result); | 69 HandleInitCompletion(result); |
69 callback->Run(result); | 70 callback->Run(result); |
70 } | 71 } |
71 | 72 |
72 void ClientSocketHandle::HandleInitCompletion(int result) { | 73 void ClientSocketHandle::HandleInitCompletion(int result) { |
73 CHECK_NE(ERR_IO_PENDING, result); | 74 CHECK_NE(ERR_IO_PENDING, result); |
74 if (result != OK) { | 75 if (result != OK) { |
75 ResetInternal(false); // The request failed, so there's nothing to cancel. | 76 ResetInternal(false); // The request failed, so there's nothing to cancel. |
76 return; | 77 return; |
77 } | 78 } |
| 79 CHECK_NE(-1, pool_id_) << "Pool should have set |pool_id_| to a valid value."; |
78 setup_time_ = base::TimeTicks::Now() - init_time_; | 80 setup_time_ = base::TimeTicks::Now() - init_time_; |
79 | 81 |
80 scoped_refptr<ClientSocketPoolHistograms> histograms = pool_->histograms(); | 82 scoped_refptr<ClientSocketPoolHistograms> histograms = pool_->histograms(); |
81 histograms->AddSocketType(reuse_type()); | 83 histograms->AddSocketType(reuse_type()); |
82 switch (reuse_type()) { | 84 switch (reuse_type()) { |
83 case ClientSocketHandle::UNUSED: | 85 case ClientSocketHandle::UNUSED: |
84 histograms->AddRequestTime(setup_time()); | 86 histograms->AddRequestTime(setup_time()); |
85 break; | 87 break; |
86 case ClientSocketHandle::UNUSED_IDLE: | 88 case ClientSocketHandle::UNUSED_IDLE: |
87 histograms->AddUnusedIdleTime(idle_time()); | 89 histograms->AddUnusedIdleTime(idle_time()); |
(...skipping 10 matching lines...) Expand all Loading... |
98 // TODO(eroman): This logging is not complete, in particular set_socket() and | 100 // TODO(eroman): This logging is not complete, in particular set_socket() and |
99 // release() socket. It ends up working though, since those methods are being | 101 // release() socket. It ends up working though, since those methods are being |
100 // used to layer sockets (and the destination sources are the same). | 102 // used to layer sockets (and the destination sources are the same). |
101 DCHECK(socket_.get()); | 103 DCHECK(socket_.get()); |
102 socket_->NetLog().BeginEvent( | 104 socket_->NetLog().BeginEvent( |
103 NetLog::TYPE_SOCKET_IN_USE, | 105 NetLog::TYPE_SOCKET_IN_USE, |
104 new NetLogSourceParameter("source_dependency", requesting_source_)); | 106 new NetLogSourceParameter("source_dependency", requesting_source_)); |
105 } | 107 } |
106 | 108 |
107 } // namespace net | 109 } // namespace net |
OLD | NEW |