Chromium Code Reviews| 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 80511f2d1a706ab772ddce29dcc21615d1884990..1313be616b959bdd02f42cccab3726fbc8211fe6 100644 |
| --- a/net/spdy/chromium/spdy_session_pool.cc |
| +++ b/net/spdy/chromium/spdy_session_pool.cc |
| @@ -438,6 +438,41 @@ 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::ResumeAllPendingRequests( |
| + 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::ResumeNextPendingRequest( |
| + const SpdySessionKey& spdy_session_key) { |
| + auto iter = spdy_session_pending_request_map_.find(spdy_session_key); |
| + if (iter != spdy_session_pending_request_map_.end()) { |
| + base::Closure callback = iter->second.front(); |
| + if (iter->second.size() == 1) |
| + spdy_session_pending_request_map_.erase(iter); |
| + iter->second.pop_front(); |
|
Bence
2017/06/09 19:17:39
Do not dereference |iter| after it's erased. How
xunjieli
2017/06/13 15:23:11
Done. Thanks!
|
| + base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, callback); |
| + } |
| +} |
| + |
| void SpdySessionPool::AddRequestToSpdySessionRequestMap( |
| const SpdySessionKey& spdy_session_key, |
| HttpStreamFactoryImpl::Request* request) { |
| @@ -462,6 +497,7 @@ void SpdySessionPool::RemoveRequestFromSpdySessionRequestMap( |
| if (request_set.empty()) |
| spdy_session_request_map_.erase(spdy_session_key); |
| request->ResetSpdySessionKey(); |
| + ResumeNextPendingRequest(spdy_session_key); |
| } |
| void SpdySessionPool::DumpMemoryStats( |