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

Unified Diff: net/socket/transport_client_socket_pool.h

Issue 240873003: Create WebSocketTransportClientSocketPool (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Rebase. Created 6 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
Index: net/socket/transport_client_socket_pool.h
diff --git a/net/socket/transport_client_socket_pool.h b/net/socket/transport_client_socket_pool.h
index 1c22bf29ec3776886ddb0e3a5d71084819f34477..003008a372ddfa1a20f4b566a583ed545b3e5f5d 100644
--- a/net/socket/transport_client_socket_pool.h
+++ b/net/socket/transport_client_socket_pool.h
@@ -55,6 +55,75 @@ class NET_EXPORT_PRIVATE TransportSocketParams
DISALLOW_COPY_AND_ASSIGN(TransportSocketParams);
};
+// Common data and logic shared between TransportConnectJob and
+// WebSocketTransportConnectJob.
+class NET_EXPORT_PRIVATE TransportConnectJobHelper {
+ public:
+ enum State {
+ STATE_RESOLVE_HOST,
+ STATE_RESOLVE_HOST_COMPLETE,
+ STATE_TRANSPORT_CONNECT,
+ STATE_TRANSPORT_CONNECT_COMPLETE,
+ STATE_NONE,
+ };
+
+ // For recording the connection time in the appropriate bucket.
+ enum ConnectionLatencyHistogram {
+ CONNECTION_LATENCY_UNKNOWN,
+ CONNECTION_LATENCY_IPV4_WINS_RACE,
+ CONNECTION_LATENCY_IPV4_NO_RACE,
+ CONNECTION_LATENCY_IPV6_RACEABLE,
+ CONNECTION_LATENCY_IPV6_SOLO,
+ };
+
+ TransportConnectJobHelper(const scoped_refptr<TransportSocketParams>& params,
+ ClientSocketFactory* client_socket_factory,
+ HostResolver* host_resolver,
+ LoadTimingInfo::ConnectTiming* connect_timing);
+ ~TransportConnectJobHelper();
+
+ ClientSocketFactory* client_socket_factory() {
+ return client_socket_factory_;
+ }
+
Ryan Sleevi 2014/07/08 18:50:02 This is a huge set of methods to leave public, for
tyoshino (SeeGerritForStatus) 2014/07/09 00:17:40 Sorry about this. I saw use of ClientSocketPoolBas
Ryan Sleevi 2014/07/09 00:20:46 Right, CSPBH is to be a base class for a set of te
+ const AddressList& addresses() const { return addresses_; }
+ State next_state() const { return next_state_; }
+ void set_next_state(State next_state) { next_state_ = next_state; }
+ CompletionCallback on_io_complete() const { return on_io_complete_; }
+
+ int DoResolveHost(RequestPriority priority, const BoundNetLog& net_log);
+ int DoResolveHostComplete(int result, const BoundNetLog& net_log);
+
+ template <class T>
+ int DoConnectInternal(T* job);
Ryan Sleevi 2014/07/08 18:50:02 These methods are public. Anyone with a helper ca
Adam Rice 2014/07/09 08:33:02 Sorry, yes, when I wrote this I was just focussed
+
+ template <class T>
+ void SetOnIOComplete(T* job);
+
+ template <class T>
+ void OnIOComplete(T* job, int result);
Ryan Sleevi 2014/07/08 18:50:02 Template methods like this are almost always a bad
+
+ // Record the histograms Net.DNS_Resolution_And_TCP_Connection_Latency2 and
+ // Net.TCP_Connection_Latency and return the connect duration.
+ base::TimeDelta HistogramDuration(ConnectionLatencyHistogram race_result);
+
+ static const int kIPv6FallbackTimerInMs;
+
+ private:
+ template <class T>
+ int DoLoop(T* job, int result);
+
+ scoped_refptr<TransportSocketParams> params_;
+ ClientSocketFactory* const client_socket_factory_;
+ SingleRequestHostResolver resolver_;
+ AddressList addresses_;
+ State next_state_;
+ CompletionCallback on_io_complete_;
+ LoadTimingInfo::ConnectTiming* connect_timing_;
+
+ DISALLOW_COPY_AND_ASSIGN(TransportConnectJobHelper);
+};
+
// TransportConnectJob handles the host resolution necessary for socket creation
// and the transport (likely TCP) connect. TransportConnectJob also has fallback
// logic for IPv6 connect() timeouts (which may happen due to networks / routers
@@ -82,27 +151,14 @@ class NET_EXPORT_PRIVATE TransportConnectJob : public ConnectJob {
// WARNING: this method should only be used to implement the prefer-IPv4 hack.
static void MakeAddressListStartWithIPv4(AddressList* addrlist);
- static const int kIPv6FallbackTimerInMs;
-
private:
- enum State {
- STATE_RESOLVE_HOST,
- STATE_RESOLVE_HOST_COMPLETE,
- STATE_TRANSPORT_CONNECT,
- STATE_TRANSPORT_CONNECT_COMPLETE,
- STATE_NONE,
- };
-
enum ConnectInterval {
CONNECT_INTERVAL_LE_10MS,
CONNECT_INTERVAL_LE_20MS,
CONNECT_INTERVAL_GT_20MS,
};
- void OnIOComplete(int result);
-
- // Runs the state transition loop.
- int DoLoop(int result);
+ friend class TransportConnectJobHelper;
Ryan Sleevi 2014/07/08 18:50:02 Every time we have a friend class, we have failed
int DoResolveHost();
int DoResolveHostComplete(int result);
@@ -118,11 +174,7 @@ class NET_EXPORT_PRIVATE TransportConnectJob : public ConnectJob {
// Otherwise, it returns a net error code.
virtual int ConnectInternal() OVERRIDE;
- scoped_refptr<TransportSocketParams> params_;
- ClientSocketFactory* const client_socket_factory_;
- SingleRequestHostResolver resolver_;
- AddressList addresses_;
- State next_state_;
+ TransportConnectJobHelper helper_;
scoped_ptr<StreamSocket> transport_socket_;
@@ -187,6 +239,12 @@ class NET_EXPORT_PRIVATE TransportClientSocketPool : public ClientSocketPool {
virtual void AddHigherLayeredPool(HigherLayeredPool* higher_pool) OVERRIDE;
virtual void RemoveHigherLayeredPool(HigherLayeredPool* higher_pool) OVERRIDE;
+ protected:
Ryan Sleevi 2014/07/08 18:50:02 The Chromium style guide strongly discourages prot
+ // Methods shared with WebSocketTransportClientSocketPool
+ void NetLogTcpClientSocketPoolRequestedSocket(
+ const BoundNetLog& net_log,
+ const scoped_refptr<TransportSocketParams>* casted_params);
Ryan Sleevi 2014/07/08 18:50:02 This doesn't look right at all. A pointer to a con
Adam Rice 2014/07/09 08:33:02 Whereas the void* argument to RequestSocket() is t
+
private:
typedef ClientSocketPoolBase<TransportSocketParams> PoolBase;
@@ -224,6 +282,61 @@ class NET_EXPORT_PRIVATE TransportClientSocketPool : public ClientSocketPool {
DISALLOW_COPY_AND_ASSIGN(TransportClientSocketPool);
};
+template <class T>
+int TransportConnectJobHelper::DoConnectInternal(T* job) {
+ next_state_ = STATE_RESOLVE_HOST;
+ return this->DoLoop(job, OK);
+}
+
+template <class T>
+void TransportConnectJobHelper::SetOnIOComplete(T* job) {
+ // These usages of base::Unretained() are safe because IO callbacks are
+ // guaranteed not to be called after the object is destroyed.
+ on_io_complete_ = base::Bind(&TransportConnectJobHelper::OnIOComplete<T>,
+ base::Unretained(this),
+ base::Unretained(job));
+}
+
+template <class T>
+void TransportConnectJobHelper::OnIOComplete(T* job, int result) {
+ result = this->DoLoop(job, result);
+ if (result != ERR_IO_PENDING)
+ job->NotifyDelegateOfCompletion(result); // Deletes |job| and |this|
+}
+
+template <class T>
+int TransportConnectJobHelper::DoLoop(T* job, int result) {
+ DCHECK_NE(next_state_, STATE_NONE);
+
+ int rv = result;
+ do {
+ State state = next_state_;
+ next_state_ = STATE_NONE;
+ switch (state) {
+ case STATE_RESOLVE_HOST:
+ DCHECK_EQ(OK, rv);
+ rv = job->DoResolveHost();
+ break;
+ case STATE_RESOLVE_HOST_COMPLETE:
+ rv = job->DoResolveHostComplete(rv);
+ break;
+ case STATE_TRANSPORT_CONNECT:
+ DCHECK_EQ(OK, rv);
+ rv = job->DoTransportConnect();
+ break;
+ case STATE_TRANSPORT_CONNECT_COMPLETE:
+ rv = job->DoTransportConnectComplete(rv);
+ break;
+ default:
+ NOTREACHED();
+ rv = ERR_FAILED;
+ break;
+ }
+ } while (rv != ERR_IO_PENDING && next_state_ != STATE_NONE);
+
+ return rv;
+}
+
} // namespace net
#endif // NET_SOCKET_TRANSPORT_CLIENT_SOCKET_POOL_H_

Powered by Google App Engine
This is Rietveld 408576698