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

Unified Diff: net/socket/ssl_client_socket_pool.cc

Issue 384873002: This CL changes the lifespan of SSLConnectJobMessengers so that they are created only when needed, (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@useloop
Patch Set: Removed FormatSessionCacheKey function. Created 6 years, 5 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/ssl_client_socket_pool.cc
diff --git a/net/socket/ssl_client_socket_pool.cc b/net/socket/ssl_client_socket_pool.cc
index 2566f3e0ffb3a79a10e5d537759f27ae0304ce04..6347c2b0592cee1af869c8aa09deaa8e8b0a14aa 100644
--- a/net/socket/ssl_client_socket_pool.cc
+++ b/net/socket/ssl_client_socket_pool.cc
@@ -99,12 +99,8 @@ SSLConnectJobMessenger::SSLConnectJobMessenger() : weak_factory_(this) {
}
bool SSLConnectJobMessenger::CanProceed(SSLClientSocket* ssl_socket) {
- // If the session is in the session cache, or there are no connecting
- // sockets allow the connection to proceed.
- if (ssl_socket->InSessionCache() || connecting_sockets_.empty()) {
- return true;
- }
- return false;
+ // If there are no connecting sockets allow the connection to proceed.
+ return connecting_sockets_.empty();
}
void SSLConnectJobMessenger::MonitorConnectionResult(
@@ -169,6 +165,10 @@ void SSLConnectJobMessenger::ConnectNewLeader() {
callback.Run();
}
+bool SSLConnectJobMessenger::IsNeeded() {
+ return pending_sockets_and_callbacks_.empty() && connecting_sockets_.empty();
+}
+
void SSLConnectJobMessenger::RunAllJobs(
std::vector<SocketAndCallback>& pending_sockets_and_callbacks) {
scoped_refptr<base::SingleThreadTaskRunner> task_runner =
@@ -194,6 +194,8 @@ SSLConnectJob::SSLConnectJob(const std::string& group_name,
HostResolver* host_resolver,
const SSLClientSocketContext& context,
SSLConnectJobMessenger* messenger,
+ AddMessengerCallback add_messenger_callback,
+ DeleteMessengerCallback delete_messenger_callback,
Delegate* delegate,
NetLog* net_log)
: ConnectJob(group_name,
@@ -217,7 +219,9 @@ SSLConnectJob::SSLConnectJob(const std::string& group_name,
io_callback_(
base::Bind(&SSLConnectJob::OnIOComplete, base::Unretained(this))),
messenger_(messenger),
- weak_factory_(this) {
+ weak_factory_(this),
+ add_messenger_callback_(add_messenger_callback),
+ delete_messenger_callback_(delete_messenger_callback) {
}
SSLConnectJob::~SSLConnectJob() {}
@@ -424,17 +428,24 @@ int SSLConnectJob::DoCreateSSLSocket() {
params_->host_and_port(),
params_->ssl_config(),
context_);
+
+ // Retrieve an SSLConnectJobMessenger for this connection if needed.
+ if (!ssl_socket_->InSessionCache())
+ GetMessenger(ssl_socket_->GetSessionCacheKey());
+
return OK;
}
int SSLConnectJob::DoCheckForResume() {
next_state_ = STATE_SSL_CONNECT;
+ if (ssl_socket_->InSessionCache())
+ return OK;
+
if (messenger_->CanProceed(ssl_socket_.get())) {
- if (ssl_socket_->InSessionCache())
- return OK;
messenger_->MonitorConnectionResult(ssl_socket_.get());
return OK;
}
+
messenger_->AddPendingSocket(
ssl_socket_.get(),
base::Bind(&net::SSLConnectJob::ResumeSSLConnection,
@@ -453,9 +464,16 @@ int SSLConnectJob::DoSSLConnect() {
int SSLConnectJob::DoSSLConnectComplete(int result) {
connect_timing_.ssl_end = base::TimeTicks::Now();
- if (result != OK && SSLClientSocket::GetEnableConnectJobWaiting())
- messenger_->OnJobFailed();
-
+ if (SSLClientSocket::GetEnableConnectJobWaiting() && messenger_ != NULL) {
+ if (result != OK)
+ messenger_->OnJobFailed();
+ else {
+ // If the connection was successful, determine if the job's messenger is
+ // still needed. If not, remove the messenger.
+ if (!messenger_->IsNeeded())
+ DeleteMessenger(ssl_socket_->GetSessionCacheKey());
+ }
+ }
SSLClientSocket::NextProtoStatus status =
SSLClientSocket::kNextProtoUnsupported;
std::string proto;
@@ -583,6 +601,15 @@ void SSLConnectJob::ResumeSSLConnection() {
OnIOComplete(OK);
}
+void SSLConnectJob::GetMessenger(std::string cache_key) {
+ messenger_ = add_messenger_callback_.Run(cache_key);
+}
+
+void SSLConnectJob::DeleteMessenger(std::string cache_key) {
+ delete_messenger_callback_.Run(cache_key);
+ messenger_ = NULL;
+}
+
SSLConnectJob::State SSLConnectJob::GetInitialState(
SSLSocketParams::ConnectionType connection_type) {
switch (connection_type) {
@@ -616,8 +643,7 @@ SSLClientSocketPool::SSLConnectJobFactory::SSLConnectJobFactory(
client_socket_factory_(client_socket_factory),
host_resolver_(host_resolver),
context_(context),
- net_log_(net_log),
- messenger_map_(new MessengerMap) {
+ net_log_(net_log) {
base::TimeDelta max_transport_timeout = base::TimeDelta();
base::TimeDelta pool_timeout;
if (transport_pool_)
@@ -689,40 +715,49 @@ SSLClientSocketPool::~SSLClientSocketPool() {
ssl_config_service_->RemoveObserver(this);
}
-scoped_ptr<ConnectJob>
-SSLClientSocketPool::SSLConnectJobFactory::NewConnectJob(
- const std::string& group_name,
- const PoolBase::Request& request,
- ConnectJob::Delegate* delegate) const {
- SSLConnectJobMessenger* messenger;
- std::string cache_key = SSLClientSocket::FormatSessionCacheKey(
- request.params()->host_and_port().ToString(),
- context_.ssl_session_cache_shard);
- if (SSLClientSocket::GetEnableConnectJobWaiting()) {
- MessengerMap::const_iterator it = messenger_map_->find(cache_key);
- if (it == messenger_map_->end()) {
- std::pair<MessengerMap::iterator, bool> iter = messenger_map_->insert(
- MessengerMap::value_type(cache_key, new SSLConnectJobMessenger()));
+SSLConnectJobMessenger*
+SSLClientSocketPool::SSLConnectJobFactory::AddSSLConnectJobMessenger(
+ std::string cache_key) {
+ MessengerMap::const_iterator it = messenger_map_.find(cache_key);
+ if (it == messenger_map_.end()) {
+ std::pair<MessengerMap::iterator, bool> iter = messenger_map_.insert(
+ MessengerMap::value_type(cache_key, new SSLConnectJobMessenger()));
it = iter.first;
}
- messenger = it->second;
- } else {
- messenger = NULL;
- }
+ return it->second;
+}
+
+void SSLClientSocketPool::SSLConnectJobFactory::DeleteSSLConnectJobMessenger(
+ std::string cache_key) {
+ MessengerMap::iterator it = messenger_map_.find(cache_key);
+ delete it->second;
+ messenger_map_.erase(it);
+}
- return scoped_ptr<ConnectJob>(new SSLConnectJob(group_name,
- request.priority(),
- request.params(),
- ConnectionTimeout(),
- transport_pool_,
- socks_pool_,
- http_proxy_pool_,
- client_socket_factory_,
- host_resolver_,
- context_,
- messenger,
- delegate,
- net_log_));
+scoped_ptr<ConnectJob> SSLClientSocketPool::SSLConnectJobFactory::NewConnectJob(
+ const std::string& group_name,
+ const PoolBase::Request& request,
+ ConnectJob::Delegate* delegate) {
+ return scoped_ptr<ConnectJob>(new SSLConnectJob(
+ group_name,
+ request.priority(),
+ request.params(),
+ ConnectionTimeout(),
+ transport_pool_,
+ socks_pool_,
+ http_proxy_pool_,
+ client_socket_factory_,
+ host_resolver_,
+ context_,
+ NULL,
+ base::Bind(
+ &SSLClientSocketPool::SSLConnectJobFactory::AddSSLConnectJobMessenger,
+ base::Unretained(this)),
+ base::Bind(&SSLClientSocketPool::SSLConnectJobFactory::
+ DeleteSSLConnectJobMessenger,
+ base::Unretained(this)),
+ delegate,
+ net_log_));
}
base::TimeDelta

Powered by Google App Engine
This is Rietveld 408576698