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 |
deleted file mode 100644 |
index 2a41ca41a8520c24c6f3e1f23da466f5464fe780..0000000000000000000000000000000000000000 |
--- a/net/http/http_pipelined_host_impl.cc |
+++ /dev/null |
@@ -1,210 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "net/http/http_pipelined_host_impl.h" |
- |
-#include "base/stl_util.h" |
-#include "base/values.h" |
-#include "net/http/http_pipelined_connection_impl.h" |
-#include "net/http/http_pipelined_stream.h" |
- |
-namespace net { |
- |
-// TODO(simonjam): Run experiments to see what value minimizes evictions without |
-// costing too much performance. Until then, this is just a bad guess. |
-static const int kNumKnownSuccessesThreshold = 3; |
- |
-HttpPipelinedHostImpl::HttpPipelinedHostImpl( |
- HttpPipelinedHost::Delegate* delegate, |
- const HttpPipelinedHost::Key& key, |
- HttpPipelinedConnection::Factory* factory, |
- HttpPipelinedHostCapability capability) |
- : delegate_(delegate), |
- key_(key), |
- factory_(factory), |
- capability_(capability) { |
- if (!factory) { |
- factory_.reset(new HttpPipelinedConnectionImpl::Factory()); |
- } |
-} |
- |
-HttpPipelinedHostImpl::~HttpPipelinedHostImpl() { |
- CHECK(pipelines_.empty()); |
-} |
- |
-HttpPipelinedStream* HttpPipelinedHostImpl::CreateStreamOnNewPipeline( |
- ClientSocketHandle* connection, |
- const SSLConfig& used_ssl_config, |
- const ProxyInfo& used_proxy_info, |
- const BoundNetLog& net_log, |
- bool was_npn_negotiated, |
- NextProto protocol_negotiated) { |
- if (capability_ == PIPELINE_INCAPABLE) { |
- return NULL; |
- } |
- HttpPipelinedConnection* pipeline = factory_->CreateNewPipeline( |
- connection, this, key_.origin(), used_ssl_config, used_proxy_info, |
- net_log, was_npn_negotiated, protocol_negotiated); |
- PipelineInfo info; |
- pipelines_.insert(std::make_pair(pipeline, info)); |
- return pipeline->CreateNewStream(); |
-} |
- |
-HttpPipelinedStream* HttpPipelinedHostImpl::CreateStreamOnExistingPipeline() { |
- HttpPipelinedConnection* available_pipeline = NULL; |
- for (PipelineInfoMap::iterator it = pipelines_.begin(); |
- it != pipelines_.end(); ++it) { |
- if (CanPipelineAcceptRequests(it->first) && |
- (!available_pipeline || |
- it->first->depth() < available_pipeline->depth())) { |
- available_pipeline = it->first; |
- } |
- } |
- if (!available_pipeline) { |
- return NULL; |
- } |
- return available_pipeline->CreateNewStream(); |
-} |
- |
-bool HttpPipelinedHostImpl::IsExistingPipelineAvailable() const { |
- for (PipelineInfoMap::const_iterator it = pipelines_.begin(); |
- it != pipelines_.end(); ++it) { |
- if (CanPipelineAcceptRequests(it->first)) { |
- return true; |
- } |
- } |
- return false; |
-} |
- |
-const HttpPipelinedHost::Key& HttpPipelinedHostImpl::GetKey() const { |
- return key_; |
-} |
- |
-void HttpPipelinedHostImpl::OnPipelineEmpty(HttpPipelinedConnection* pipeline) { |
- CHECK(ContainsKey(pipelines_, pipeline)); |
- pipelines_.erase(pipeline); |
- delete pipeline; |
- if (pipelines_.empty()) { |
- delegate_->OnHostIdle(this); |
- // WARNING: We'll probably be deleted here. |
- } |
-} |
- |
-void HttpPipelinedHostImpl::OnPipelineHasCapacity( |
- HttpPipelinedConnection* pipeline) { |
- CHECK(ContainsKey(pipelines_, pipeline)); |
- if (CanPipelineAcceptRequests(pipeline)) { |
- delegate_->OnHostHasAdditionalCapacity(this); |
- } |
- if (!pipeline->depth()) { |
- OnPipelineEmpty(pipeline); |
- // WARNING: We might be deleted here. |
- } |
-} |
- |
-void HttpPipelinedHostImpl::OnPipelineFeedback( |
- HttpPipelinedConnection* pipeline, |
- HttpPipelinedConnection::Feedback feedback) { |
- CHECK(ContainsKey(pipelines_, pipeline)); |
- switch (feedback) { |
- case HttpPipelinedConnection::OK: |
- ++pipelines_[pipeline].num_successes; |
- if (capability_ == PIPELINE_UNKNOWN) { |
- capability_ = PIPELINE_PROBABLY_CAPABLE; |
- NotifyAllPipelinesHaveCapacity(); |
- } else if (capability_ == PIPELINE_PROBABLY_CAPABLE && |
- pipelines_[pipeline].num_successes >= |
- kNumKnownSuccessesThreshold) { |
- capability_ = PIPELINE_CAPABLE; |
- delegate_->OnHostDeterminedCapability(this, PIPELINE_CAPABLE); |
- } |
- break; |
- |
- case HttpPipelinedConnection::PIPELINE_SOCKET_ERROR: |
- // Socket errors on the initial request - when no other requests are |
- // pipelined - can't be due to pipelining. |
- if (pipelines_[pipeline].num_successes > 0 || pipeline->depth() > 1) { |
- // TODO(simonjam): This may be needlessly harsh. For example, pogo.com |
- // only returns a socket error once after the root document, but is |
- // otherwise able to pipeline just fine. Consider being more persistent |
- // and only give up on pipelining if we get a couple of failures. |
- capability_ = PIPELINE_INCAPABLE; |
- delegate_->OnHostDeterminedCapability(this, PIPELINE_INCAPABLE); |
- } |
- break; |
- |
- case HttpPipelinedConnection::OLD_HTTP_VERSION: |
- case HttpPipelinedConnection::AUTHENTICATION_REQUIRED: |
- capability_ = PIPELINE_INCAPABLE; |
- delegate_->OnHostDeterminedCapability(this, PIPELINE_INCAPABLE); |
- break; |
- |
- case HttpPipelinedConnection::MUST_CLOSE_CONNECTION: |
- break; |
- } |
-} |
- |
-int HttpPipelinedHostImpl::GetPipelineCapacity() const { |
- int capacity = 0; |
- switch (capability_) { |
- case PIPELINE_CAPABLE: |
- case PIPELINE_PROBABLY_CAPABLE: |
- capacity = max_pipeline_depth(); |
- break; |
- |
- case PIPELINE_INCAPABLE: |
- CHECK(false); |
- |
- case PIPELINE_UNKNOWN: |
- capacity = 1; |
- break; |
- |
- default: |
- CHECK(false) << "Unkown pipeline capability: " << capability_; |
- } |
- return capacity; |
-} |
- |
-bool HttpPipelinedHostImpl::CanPipelineAcceptRequests( |
- HttpPipelinedConnection* pipeline) const { |
- return capability_ != PIPELINE_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); |
- } |
- } |
-} |
- |
-base::Value* HttpPipelinedHostImpl::PipelineInfoToValue() const { |
- base::ListValue* list_value = new base::ListValue(); |
- for (PipelineInfoMap::const_iterator it = pipelines_.begin(); |
- it != pipelines_.end(); ++it) { |
- base::DictionaryValue* pipeline_dict = new base::DictionaryValue; |
- pipeline_dict->SetString("host", key_.origin().ToString()); |
- pipeline_dict->SetBoolean("forced", false); |
- pipeline_dict->SetInteger("depth", it->first->depth()); |
- pipeline_dict->SetInteger("capacity", GetPipelineCapacity()); |
- pipeline_dict->SetBoolean("usable", it->first->usable()); |
- pipeline_dict->SetBoolean("active", it->first->active()); |
- pipeline_dict->SetInteger("source_id", it->first->net_log().source().id); |
- list_value->Append(pipeline_dict); |
- } |
- return list_value; |
-} |
- |
-HttpPipelinedHostImpl::PipelineInfo::PipelineInfo() |
- : num_successes(0) { |
-} |
- |
-} // namespace net |