diff options
author | mmenke@chromium.org <mmenke@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-08-22 23:41:52 +0000 |
---|---|---|
committer | mmenke@chromium.org <mmenke@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-08-22 23:41:52 +0000 |
commit | 043b68c80a7643136fa85a80e6079573d4d5e953 (patch) | |
tree | a40e4a49d59b3f432e28055c8e7255e53e039774 /net/socket/client_socket_handle.cc | |
parent | 31ac75da9f18c250bdab355b4a2c98cba99e08dd (diff) | |
download | chromium_src-043b68c80a7643136fa85a80e6079573d4d5e953.zip chromium_src-043b68c80a7643136fa85a80e6079573d4d5e953.tar.gz chromium_src-043b68c80a7643136fa85a80e6079573d4d5e953.tar.bz2 |
When an idle socket is added back to a socket pool,
check if lower layer socket pools are stalled. If so,
close the idle socket.
Also, when a SPDY stream is destroyed, check if
the session is idle and a lower layer pool is stalled,
and close the session if needed.
BUG=92244
Review URL: https://chromiumcodereview.appspot.com/18796003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@219147 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/socket/client_socket_handle.cc')
-rw-r--r-- | net/socket/client_socket_handle.cc | 34 |
1 files changed, 19 insertions, 15 deletions
diff --git a/net/socket/client_socket_handle.cc b/net/socket/client_socket_handle.cc index acb896b..9687a5a 100644 --- a/net/socket/client_socket_handle.cc +++ b/net/socket/client_socket_handle.cc @@ -18,7 +18,7 @@ namespace net { ClientSocketHandle::ClientSocketHandle() : is_initialized_(false), pool_(NULL), - layered_pool_(NULL), + higher_pool_(NULL), is_reused_(false), callback_(base::Bind(&ClientSocketHandle::OnIOComplete, base::Unretained(this))), @@ -53,10 +53,8 @@ void ClientSocketHandle::ResetInternal(bool cancel) { group_name_.clear(); is_reused_ = false; user_callback_.Reset(); - if (layered_pool_) { - pool_->RemoveLayeredPool(layered_pool_); - layered_pool_ = NULL; - } + if (higher_pool_) + RemoveHigherLayeredPool(higher_pool_); pool_ = NULL; idle_time_ = base::TimeDelta(); init_time_ = base::TimeTicks(); @@ -82,24 +80,30 @@ LoadState ClientSocketHandle::GetLoadState() const { } bool ClientSocketHandle::IsPoolStalled() const { + if (!pool_) + return false; return pool_->IsStalled(); } -void ClientSocketHandle::AddLayeredPool(LayeredPool* layered_pool) { - CHECK(layered_pool); - CHECK(!layered_pool_); +void ClientSocketHandle::AddHigherLayeredPool(HigherLayeredPool* higher_pool) { + CHECK(higher_pool); + CHECK(!higher_pool_); + // TODO(mmenke): |pool_| should only be NULL in tests. Maybe stop doing that + // so this be be made into a DCHECK, and the same can be done in + // RemoveHigherLayeredPool? if (pool_) { - pool_->AddLayeredPool(layered_pool); - layered_pool_ = layered_pool; + pool_->AddHigherLayeredPool(higher_pool); + higher_pool_ = higher_pool; } } -void ClientSocketHandle::RemoveLayeredPool(LayeredPool* layered_pool) { - CHECK(layered_pool); - CHECK(layered_pool_); +void ClientSocketHandle::RemoveHigherLayeredPool( + HigherLayeredPool* higher_pool) { + CHECK(higher_pool_); + CHECK_EQ(higher_pool_, higher_pool); if (pool_) { - pool_->RemoveLayeredPool(layered_pool); - layered_pool_ = NULL; + pool_->RemoveHigherLayeredPool(higher_pool); + higher_pool_ = NULL; } } |