OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/http/http_pipelined_host_pool.h" | 5 #include "net/http/http_pipelined_host_pool.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/stl_util.h" | 8 #include "base/stl_util.h" |
| 9 #include "net/http/http_pipelined_host_capability.h" |
9 #include "net/http/http_pipelined_host_impl.h" | 10 #include "net/http/http_pipelined_host_impl.h" |
| 11 #include "net/http/http_server_properties.h" |
10 | 12 |
11 namespace net { | 13 namespace net { |
12 | 14 |
13 // TODO(simonjam): Run experiments with different values of this to see what | |
14 // value is good at avoiding evictions without eating too much memory. Until | |
15 // then, this is just a bad guess. | |
16 static const int kNumHostsToRemember = 200; | |
17 | |
18 class HttpPipelinedHostImplFactory : public HttpPipelinedHost::Factory { | 15 class HttpPipelinedHostImplFactory : public HttpPipelinedHost::Factory { |
19 public: | 16 public: |
20 virtual HttpPipelinedHost* CreateNewHost( | 17 virtual HttpPipelinedHost* CreateNewHost( |
21 HttpPipelinedHost::Delegate* delegate, const HostPortPair& origin, | 18 HttpPipelinedHost::Delegate* delegate, const HostPortPair& origin, |
22 HttpPipelinedConnection::Factory* factory, | 19 HttpPipelinedConnection::Factory* factory, |
23 HttpPipelinedHost::Capability capability) OVERRIDE { | 20 HttpPipelinedHostCapability capability) OVERRIDE { |
24 return new HttpPipelinedHostImpl(delegate, origin, factory, capability); | 21 return new HttpPipelinedHostImpl(delegate, origin, factory, capability); |
25 } | 22 } |
26 }; | 23 }; |
27 | 24 |
28 HttpPipelinedHostPool::HttpPipelinedHostPool( | 25 HttpPipelinedHostPool::HttpPipelinedHostPool( |
29 Delegate* delegate, | 26 Delegate* delegate, |
30 HttpPipelinedHost::Factory* factory) | 27 HttpPipelinedHost::Factory* factory, |
| 28 HttpServerProperties* http_server_properties) |
31 : delegate_(delegate), | 29 : delegate_(delegate), |
32 factory_(factory), | 30 factory_(factory), |
33 known_capability_map_(kNumHostsToRemember) { | 31 http_server_properties_(http_server_properties) { |
34 if (!factory) { | 32 if (!factory) { |
35 factory_.reset(new HttpPipelinedHostImplFactory); | 33 factory_.reset(new HttpPipelinedHostImplFactory); |
36 } | 34 } |
37 } | 35 } |
38 | 36 |
39 HttpPipelinedHostPool::~HttpPipelinedHostPool() { | 37 HttpPipelinedHostPool::~HttpPipelinedHostPool() { |
40 CHECK(host_map_.empty()); | 38 CHECK(host_map_.empty()); |
41 } | 39 } |
42 | 40 |
43 bool HttpPipelinedHostPool::IsHostEligibleForPipelining( | 41 bool HttpPipelinedHostPool::IsHostEligibleForPipelining( |
44 const HostPortPair& origin) { | 42 const HostPortPair& origin) { |
45 HttpPipelinedHost::Capability capability = GetHostCapability(origin); | 43 HttpPipelinedHostCapability capability = |
46 return capability != HttpPipelinedHost::INCAPABLE; | 44 http_server_properties_->GetPipelineCapability(origin); |
| 45 return capability != PIPELINE_INCAPABLE; |
47 } | 46 } |
48 | 47 |
49 HttpPipelinedStream* HttpPipelinedHostPool::CreateStreamOnNewPipeline( | 48 HttpPipelinedStream* HttpPipelinedHostPool::CreateStreamOnNewPipeline( |
50 const HostPortPair& origin, | 49 const HostPortPair& origin, |
51 ClientSocketHandle* connection, | 50 ClientSocketHandle* connection, |
52 const SSLConfig& used_ssl_config, | 51 const SSLConfig& used_ssl_config, |
53 const ProxyInfo& used_proxy_info, | 52 const ProxyInfo& used_proxy_info, |
54 const BoundNetLog& net_log, | 53 const BoundNetLog& net_log, |
55 bool was_npn_negotiated) { | 54 bool was_npn_negotiated) { |
56 HttpPipelinedHost* host = GetPipelinedHost(origin, true); | 55 HttpPipelinedHost* host = GetPipelinedHost(origin, true); |
(...skipping 26 matching lines...) Expand all Loading... |
83 HttpPipelinedHost* HttpPipelinedHostPool::GetPipelinedHost( | 82 HttpPipelinedHost* HttpPipelinedHostPool::GetPipelinedHost( |
84 const HostPortPair& origin, bool create_if_not_found) { | 83 const HostPortPair& origin, bool create_if_not_found) { |
85 HostMap::iterator host_it = host_map_.find(origin); | 84 HostMap::iterator host_it = host_map_.find(origin); |
86 if (host_it != host_map_.end()) { | 85 if (host_it != host_map_.end()) { |
87 CHECK(host_it->second); | 86 CHECK(host_it->second); |
88 return host_it->second; | 87 return host_it->second; |
89 } else if (!create_if_not_found) { | 88 } else if (!create_if_not_found) { |
90 return NULL; | 89 return NULL; |
91 } | 90 } |
92 | 91 |
93 HttpPipelinedHost::Capability capability = GetHostCapability(origin); | 92 HttpPipelinedHostCapability capability = |
94 if (capability == HttpPipelinedHost::INCAPABLE) { | 93 http_server_properties_->GetPipelineCapability(origin); |
| 94 if (capability == PIPELINE_INCAPABLE) { |
95 return NULL; | 95 return NULL; |
96 } | 96 } |
97 | 97 |
98 HttpPipelinedHost* host = factory_->CreateNewHost( | 98 HttpPipelinedHost* host = factory_->CreateNewHost( |
99 this, origin, NULL, capability); | 99 this, origin, NULL, capability); |
100 host_map_[origin] = host; | 100 host_map_[origin] = host; |
101 return host; | 101 return host; |
102 } | 102 } |
103 | 103 |
104 void HttpPipelinedHostPool::OnHostIdle(HttpPipelinedHost* host) { | 104 void HttpPipelinedHostPool::OnHostIdle(HttpPipelinedHost* host) { |
105 const HostPortPair& origin = host->origin(); | 105 const HostPortPair& origin = host->origin(); |
106 CHECK(ContainsKey(host_map_, origin)); | 106 CHECK(ContainsKey(host_map_, origin)); |
107 host_map_.erase(origin); | 107 host_map_.erase(origin); |
108 delete host; | 108 delete host; |
109 } | 109 } |
110 | 110 |
111 void HttpPipelinedHostPool::OnHostHasAdditionalCapacity( | 111 void HttpPipelinedHostPool::OnHostHasAdditionalCapacity( |
112 HttpPipelinedHost* host) { | 112 HttpPipelinedHost* host) { |
113 delegate_->OnHttpPipelinedHostHasAdditionalCapacity(host->origin()); | 113 delegate_->OnHttpPipelinedHostHasAdditionalCapacity(host->origin()); |
114 } | 114 } |
115 | 115 |
116 void HttpPipelinedHostPool::OnHostDeterminedCapability( | 116 void HttpPipelinedHostPool::OnHostDeterminedCapability( |
117 HttpPipelinedHost* host, | 117 HttpPipelinedHost* host, |
118 HttpPipelinedHost::Capability capability) { | 118 HttpPipelinedHostCapability capability) { |
119 CapabilityMap::iterator known_it = known_capability_map_.Get(host->origin()); | 119 http_server_properties_->SetPipelineCapability(host->origin(), capability); |
120 if (known_it == known_capability_map_.end() || | |
121 known_it->second != HttpPipelinedHost::INCAPABLE) { | |
122 known_capability_map_.Put(host->origin(), capability); | |
123 } | |
124 } | |
125 | |
126 HttpPipelinedHost::Capability HttpPipelinedHostPool::GetHostCapability( | |
127 const HostPortPair& origin) { | |
128 HttpPipelinedHost::Capability capability = HttpPipelinedHost::UNKNOWN; | |
129 CapabilityMap::const_iterator it = known_capability_map_.Get(origin); | |
130 if (it != known_capability_map_.end()) { | |
131 capability = it->second; | |
132 } | |
133 return capability; | |
134 } | 120 } |
135 | 121 |
136 } // namespace net | 122 } // namespace net |
OLD | NEW |