Index: net/http/http_pipelined_host_impl.cc |
diff --git a/net/http/http_pipelined_host_impl.cc b/net/http/http_pipelined_host_impl.cc |
index 2501476387f31c8a8e7c8a731b4a24aedd3fcd96..d554fe1f4cf438169badb8d16a69ae9e92726d71 100644 |
--- a/net/http/http_pipelined_host_impl.cc |
+++ b/net/http/http_pipelined_host_impl.cc |
@@ -69,9 +69,7 @@ HttpPipelinedStream* HttpPipelinedHostImpl::CreateStreamOnExistingPipeline() { |
HttpPipelinedConnection* available_pipeline = NULL; |
for (PipelineInfoMap::iterator it = pipelines_.begin(); |
it != pipelines_.end(); ++it) { |
- if (it->first->usable() && |
- it->first->active() && |
- it->first->depth() < GetPipelineCapacity() && |
+ if (CanPipelineAcceptRequests(it->first) && |
(!available_pipeline || |
it->first->depth() < available_pipeline->depth())) { |
available_pipeline = it->first; |
@@ -86,9 +84,7 @@ HttpPipelinedStream* HttpPipelinedHostImpl::CreateStreamOnExistingPipeline() { |
bool HttpPipelinedHostImpl::IsExistingPipelineAvailable() const { |
for (PipelineInfoMap::const_iterator it = pipelines_.begin(); |
it != pipelines_.end(); ++it) { |
- if (it->first->usable() && |
- it->first->active() && |
- it->first->depth() < GetPipelineCapacity()) { |
+ if (CanPipelineAcceptRequests(it->first)) { |
return true; |
} |
} |
@@ -112,9 +108,7 @@ void HttpPipelinedHostImpl::OnPipelineEmpty(HttpPipelinedConnection* pipeline) { |
void HttpPipelinedHostImpl::OnPipelineHasCapacity( |
HttpPipelinedConnection* pipeline) { |
CHECK(ContainsKey(pipelines_, pipeline)); |
- if (pipeline->usable() && |
- capability_ != INCAPABLE && |
- pipeline->depth() < GetPipelineCapacity()) { |
+ if (CanPipelineAcceptRequests(pipeline)) { |
delegate_->OnHostHasAdditionalCapacity(this); |
} |
if (!pipeline->depth()) { |
@@ -132,10 +126,7 @@ void HttpPipelinedHostImpl::OnPipelineFeedback( |
++pipelines_[pipeline].num_successes; |
if (capability_ == UNKNOWN) { |
capability_ = PROBABLY_CAPABLE; |
- for (PipelineInfoMap::iterator it = pipelines_.begin(); |
- it != pipelines_.end(); ++it) { |
- OnPipelineHasCapacity(it->first); |
- } |
+ NotifyAllPipelinesHaveCapacity(); |
} else if (capability_ == PROBABLY_CAPABLE && |
pipelines_[pipeline].num_successes >= |
kNumKnownSuccessesThreshold) { |
@@ -176,6 +167,26 @@ int HttpPipelinedHostImpl::GetPipelineCapacity() const { |
return capacity; |
} |
+bool HttpPipelinedHostImpl::CanPipelineAcceptRequests( |
+ HttpPipelinedConnection* pipeline) const { |
+ return capability_ != INCAPABLE && |
+ pipeline->usable() && |
+ pipeline->active() && |
+ pipeline->depth() < GetPipelineCapacity(); |
+} |
+ |
+void HttpPipelinedHostImpl::NotifyAllPipelinesHaveCapacity() { |
+ // Calling OnPipelineHasCapacity() can have side effects that include |
+ // deleting and removing entries from |pipelines_|. |
+ PipelineInfoMap pipelines_to_notify = pipelines_; |
+ for (PipelineInfoMap::iterator it = pipelines_to_notify.begin(); |
+ it != pipelines_to_notify.end(); ++it) { |
+ if (pipelines_.find(it->first) != pipelines_.end()) { |
+ OnPipelineHasCapacity(it->first); |
+ } |
+ } |
+} |
+ |
HttpPipelinedHostImpl::PipelineInfo::PipelineInfo() |
: num_successes(0) { |
} |