Index: net/spdy/chromium/spdy_session_pool.cc |
diff --git a/net/spdy/chromium/spdy_session_pool.cc b/net/spdy/chromium/spdy_session_pool.cc |
index 5b10bf84392987f7351182029a461021b49b7003..a2ff1402ce84c5e60c9a8bca0915a89972baa881 100644 |
--- a/net/spdy/chromium/spdy_session_pool.cc |
+++ b/net/spdy/chromium/spdy_session_pool.cc |
@@ -439,6 +439,29 @@ void SpdySessionPool::OnNewSpdySessionReady( |
// TODO(mbelshe): Alert other valid requests. |
} |
+bool SpdySessionPool::StartRequest(const SpdySessionKey& spdy_session_key, |
+ const base::Closure& callback) { |
+ auto iter = spdy_session_pending_request_map_.find(spdy_session_key); |
+ if (iter == spdy_session_pending_request_map_.end()) { |
+ spdy_session_pending_request_map_.emplace(spdy_session_key, |
+ std::list<base::Closure>{}); |
+ return true; |
+ } |
+ iter->second.push_back(callback); |
+ return false; |
+} |
+ |
+void SpdySessionPool::ResumePendingRequests( |
+ const SpdySessionKey& spdy_session_key) { |
+ auto iter = spdy_session_pending_request_map_.find(spdy_session_key); |
+ if (iter != spdy_session_pending_request_map_.end()) { |
+ for (auto callback : iter->second) { |
+ base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, callback); |
+ } |
+ spdy_session_pending_request_map_.erase(iter); |
+ } |
+} |
+ |
void SpdySessionPool::AddRequestToSpdySessionRequestMap( |
const SpdySessionKey& spdy_session_key, |
HttpStreamFactoryImpl::Request* request) { |
@@ -455,6 +478,9 @@ void SpdySessionPool::RemoveRequestFromSpdySessionRequestMap( |
if (!request->HasSpdySessionKey()) |
return; |
const SpdySessionKey& spdy_session_key = request->GetSpdySessionKey(); |
+ // Resume all pending requests now that |request| is done/canceled. |
+ ResumePendingRequests(spdy_session_key); |
+ |
auto iter = spdy_session_request_map_.find(spdy_session_key); |
DCHECK(iter != spdy_session_request_map_.end()); |
RequestSet& request_set = iter->second; |
@@ -462,6 +488,7 @@ void SpdySessionPool::RemoveRequestFromSpdySessionRequestMap( |
request_set.erase(request); |
if (request_set.empty()) |
spdy_session_request_map_.erase(spdy_session_key); |
+ // Resets |request|'s SpdySessionKey. This will invalid |spdy_session_key|. |
request->ResetSpdySessionKey(); |
} |