| 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();
|
| }
|
|
|
|
|