Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(698)

Unified Diff: net/socket/tcp_client_socket_pool.cc

Issue 151118: Refactor ConnectJob and TCPConnectJob. (Closed)
Patch Set: Add comments. Created 11 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/socket/tcp_client_socket_pool.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/socket/tcp_client_socket_pool.cc
diff --git a/net/socket/tcp_client_socket_pool.cc b/net/socket/tcp_client_socket_pool.cc
index c9af808c5a2d8d890e6aef058b84746d9885e26a..a5b5595487a2e0475d394f0908576df6c9442086 100644
--- a/net/socket/tcp_client_socket_pool.cc
+++ b/net/socket/tcp_client_socket_pool.cc
@@ -25,14 +25,12 @@ TCPConnectJob::TCPConnectJob(
ClientSocketFactory* client_socket_factory,
HostResolver* host_resolver,
Delegate* delegate)
- : group_name_(group_name),
+ : ConnectJob(group_name, handle, delegate),
resolve_info_(resolve_info),
- handle_(handle),
client_socket_factory_(client_socket_factory),
ALLOW_THIS_IN_INITIALIZER_LIST(
callback_(this,
&TCPConnectJob::OnIOComplete)),
- delegate_(delegate),
resolver_(host_resolver) {}
TCPConnectJob::~TCPConnectJob() {
@@ -41,33 +39,73 @@ TCPConnectJob::~TCPConnectJob() {
}
int TCPConnectJob::Connect() {
- set_load_state(LOAD_STATE_RESOLVING_HOST);
- int rv = resolver_.Resolve(resolve_info_, &addresses_, &callback_);
+ next_state_ = kStateResolveHost;
+ return DoLoop(OK);
+}
+
+void TCPConnectJob::OnIOComplete(int result) {
+ int rv = DoLoop(result);
if (rv != ERR_IO_PENDING)
- rv = OnIOCompleteInternal(rv, true /* synchronous */);
+ delegate()->OnConnectJobComplete(rv, this); // Deletes |this|
+}
+
+int TCPConnectJob::DoLoop(int result) {
+ DCHECK_NE(next_state_, kStateNone);
+
+ int rv = result;
+ do {
+ State state = next_state_;
+ next_state_ = kStateNone;
+ switch (state) {
+ case kStateResolveHost:
+ DCHECK_EQ(OK, rv);
+ rv = DoResolveHost();
+ break;
+ case kStateResolveHostComplete:
+ rv = DoResolveHostComplete(rv);
+ break;
+ case kStateTCPConnect:
+ DCHECK_EQ(OK, rv);
+ rv = DoTCPConnect();
+ break;
+ case kStateTCPConnectComplete:
+ rv = DoTCPConnectComplete(rv);
+ break;
+ default:
+ NOTREACHED();
+ rv = ERR_FAILED;
+ break;
+ }
+ } while (rv != ERR_IO_PENDING && next_state_ != kStateNone);
+
return rv;
}
-void TCPConnectJob::OnIOComplete(int result) {
- OnIOCompleteInternal(result, false /* asynchronous */);
+int TCPConnectJob::DoResolveHost() {
+ set_load_state(LOAD_STATE_RESOLVING_HOST);
+ next_state_ = kStateResolveHostComplete;
+ return resolver_.Resolve(resolve_info_, &addresses_, &callback_);
}
-int TCPConnectJob::OnIOCompleteInternal(
- int result, bool synchronous) {
- CHECK(result != ERR_IO_PENDING);
-
- if (result == OK && load_state() == LOAD_STATE_RESOLVING_HOST) {
- set_load_state(LOAD_STATE_CONNECTING);
- socket_.reset(client_socket_factory_->CreateTCPClientSocket(addresses_));
- connect_start_time_ = base::TimeTicks::Now();
- result = socket_->Connect(&callback_);
- if (result == ERR_IO_PENDING)
- return result;
- }
+int TCPConnectJob::DoResolveHostComplete(int result) {
+ DCHECK_EQ(LOAD_STATE_RESOLVING_HOST, load_state());
+ if (result == OK)
+ next_state_ = kStateTCPConnect;
+ return result;
+}
+int TCPConnectJob::DoTCPConnect() {
+ next_state_ = kStateTCPConnectComplete;
+ set_load_state(LOAD_STATE_CONNECTING);
+ set_socket(client_socket_factory_->CreateTCPClientSocket(addresses_));
+ connect_start_time_ = base::TimeTicks::Now();
+ return socket()->Connect(&callback_);
+}
+
+int TCPConnectJob::DoTCPConnectComplete(int result) {
+ DCHECK_EQ(load_state(), LOAD_STATE_CONNECTING);
if (result == OK) {
- DCHECK_EQ(load_state(), LOAD_STATE_CONNECTING);
- CHECK(connect_start_time_ != base::TimeTicks());
+ DCHECK(connect_start_time_ != base::TimeTicks());
base::TimeDelta connect_duration =
base::TimeTicks::Now() - connect_start_time_;
@@ -78,17 +116,6 @@ int TCPConnectJob::OnIOCompleteInternal(
100);
}
- // Now, we either succeeded at Connect()'ing, or we failed at host resolution
- // or Connect()'ing. Either way, we'll run the callback to alert the client.
-
- delegate_->OnConnectJobComplete(
- group_name_,
- handle_,
- result == OK ? socket_.release() : NULL,
- result,
- !synchronous);
-
- // |this| is deleted after this point.
return result;
}
« no previous file with comments | « net/socket/tcp_client_socket_pool.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698