| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/renderer/chrome_render_process_observer.h" | 5 #include "chrome/renderer/chrome_render_process_observer.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/allocator/allocator_extension.h" | 10 #include "base/allocator/allocator_extension.h" |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 #include "chrome/common/render_messages.h" | 27 #include "chrome/common/render_messages.h" |
| 28 #include "chrome/common/url_constants.h" | 28 #include "chrome/common/url_constants.h" |
| 29 #include "chrome/common/variations/variations_util.h" | 29 #include "chrome/common/variations/variations_util.h" |
| 30 #include "chrome/renderer/content_settings_observer.h" | 30 #include "chrome/renderer/content_settings_observer.h" |
| 31 #include "chrome/renderer/extensions/extension_localization_peer.h" | 31 #include "chrome/renderer/extensions/extension_localization_peer.h" |
| 32 #include "chrome/renderer/security_filter_peer.h" | 32 #include "chrome/renderer/security_filter_peer.h" |
| 33 #include "content/public/child/resource_dispatcher_delegate.h" | 33 #include "content/public/child/resource_dispatcher_delegate.h" |
| 34 #include "content/public/renderer/render_thread.h" | 34 #include "content/public/renderer/render_thread.h" |
| 35 #include "content/public/renderer/render_view.h" | 35 #include "content/public/renderer/render_view.h" |
| 36 #include "content/public/renderer/render_view_visitor.h" | 36 #include "content/public/renderer/render_view_visitor.h" |
| 37 #include "content/public/renderer/v8_heap_statistics_collector.h" |
| 37 #include "crypto/nss_util.h" | 38 #include "crypto/nss_util.h" |
| 38 #include "net/base/net_errors.h" | 39 #include "net/base/net_errors.h" |
| 39 #include "net/base/net_module.h" | 40 #include "net/base/net_module.h" |
| 40 #include "third_party/WebKit/public/web/WebCache.h" | 41 #include "third_party/WebKit/public/web/WebCache.h" |
| 41 #include "third_party/WebKit/public/web/WebDocument.h" | 42 #include "third_party/WebKit/public/web/WebDocument.h" |
| 42 #include "third_party/WebKit/public/web/WebFrame.h" | 43 #include "third_party/WebKit/public/web/WebFrame.h" |
| 43 #include "third_party/WebKit/public/web/WebRuntimeFeatures.h" | 44 #include "third_party/WebKit/public/web/WebRuntimeFeatures.h" |
| 44 #include "third_party/WebKit/public/web/WebSecurityPolicy.h" | 45 #include "third_party/WebKit/public/web/WebSecurityPolicy.h" |
| 45 #include "third_party/WebKit/public/web/WebView.h" | 46 #include "third_party/WebKit/public/web/WebView.h" |
| 46 | 47 |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 138 std::vector<char> font_data; | 139 std::vector<char> font_data; |
| 139 RenderThread::Get()->PreCacheFont(logfont); | 140 RenderThread::Get()->PreCacheFont(logfont); |
| 140 rv = GetFontData(hdc, table, offset, buffer, length); | 141 rv = GetFontData(hdc, table, offset, buffer, length); |
| 141 RenderThread::Get()->ReleaseCachedFonts(); | 142 RenderThread::Get()->ReleaseCachedFonts(); |
| 142 } | 143 } |
| 143 } | 144 } |
| 144 return rv; | 145 return rv; |
| 145 } | 146 } |
| 146 #endif // OS_WIN | 147 #endif // OS_WIN |
| 147 | 148 |
| 148 static const int kWaitForWorkersStatsTimeoutMS = 20; | |
| 149 | |
| 150 class HeapStatisticsCollector { | |
| 151 public: | |
| 152 HeapStatisticsCollector() : round_id_(0) {} | |
| 153 | |
| 154 void InitiateCollection(); | |
| 155 static HeapStatisticsCollector* Instance(); | |
| 156 | |
| 157 private: | |
| 158 void CollectOnWorkerThread(scoped_refptr<base::TaskRunner> master, | |
| 159 int round_id); | |
| 160 void ReceiveStats(int round_id, size_t total_size, size_t used_size); | |
| 161 void SendStatsToBrowser(int round_id); | |
| 162 | |
| 163 size_t total_bytes_; | |
| 164 size_t used_bytes_; | |
| 165 int workers_to_go_; | |
| 166 int round_id_; | |
| 167 }; | |
| 168 | |
| 169 HeapStatisticsCollector* HeapStatisticsCollector::Instance() { | |
| 170 CR_DEFINE_STATIC_LOCAL(HeapStatisticsCollector, instance, ()); | |
| 171 return &instance; | |
| 172 } | |
| 173 | |
| 174 void HeapStatisticsCollector::InitiateCollection() { | |
| 175 v8::HeapStatistics heap_stats; | |
| 176 v8::Isolate::GetCurrent()->GetHeapStatistics(&heap_stats); | |
| 177 total_bytes_ = heap_stats.total_heap_size(); | |
| 178 used_bytes_ = heap_stats.used_heap_size(); | |
| 179 base::Closure collect = base::Bind( | |
| 180 &HeapStatisticsCollector::CollectOnWorkerThread, | |
| 181 base::Unretained(this), | |
| 182 base::MessageLoopProxy::current(), | |
| 183 round_id_); | |
| 184 workers_to_go_ = RenderThread::Get()->PostTaskToAllWebWorkers(collect); | |
| 185 if (workers_to_go_) { | |
| 186 // The guard task to send out partial stats | |
| 187 // in case some workers are not responsive. | |
| 188 base::MessageLoopProxy::current()->PostDelayedTask( | |
| 189 FROM_HERE, | |
| 190 base::Bind(&HeapStatisticsCollector::SendStatsToBrowser, | |
| 191 base::Unretained(this), | |
| 192 round_id_), | |
| 193 base::TimeDelta::FromMilliseconds(kWaitForWorkersStatsTimeoutMS)); | |
| 194 } else { | |
| 195 // No worker threads so just send out the main thread data right away. | |
| 196 SendStatsToBrowser(round_id_); | |
| 197 } | |
| 198 } | |
| 199 | |
| 200 void HeapStatisticsCollector::CollectOnWorkerThread( | |
| 201 scoped_refptr<base::TaskRunner> master, | |
| 202 int round_id) { | |
| 203 | |
| 204 size_t total_bytes = 0; | |
| 205 size_t used_bytes = 0; | |
| 206 v8::Isolate* isolate = v8::Isolate::GetCurrent(); | |
| 207 if (isolate) { | |
| 208 v8::HeapStatistics heap_stats; | |
| 209 isolate->GetHeapStatistics(&heap_stats); | |
| 210 total_bytes = heap_stats.total_heap_size(); | |
| 211 used_bytes = heap_stats.used_heap_size(); | |
| 212 } | |
| 213 master->PostTask( | |
| 214 FROM_HERE, | |
| 215 base::Bind(&HeapStatisticsCollector::ReceiveStats, | |
| 216 base::Unretained(this), | |
| 217 round_id, | |
| 218 total_bytes, | |
| 219 used_bytes)); | |
| 220 } | |
| 221 | |
| 222 void HeapStatisticsCollector::ReceiveStats(int round_id, | |
| 223 size_t total_bytes, | |
| 224 size_t used_bytes) { | |
| 225 if (round_id != round_id_) | |
| 226 return; | |
| 227 total_bytes_ += total_bytes; | |
| 228 used_bytes_ += used_bytes; | |
| 229 if (!--workers_to_go_) | |
| 230 SendStatsToBrowser(round_id); | |
| 231 } | |
| 232 | |
| 233 void HeapStatisticsCollector::SendStatsToBrowser(int round_id) { | |
| 234 if (round_id != round_id_) | |
| 235 return; | |
| 236 // TODO(alph): Do caching heap stats and use the cache if we haven't got | |
| 237 // reply from a worker. | |
| 238 // Currently a busy worker stats are not counted. | |
| 239 RenderThread::Get()->Send(new ChromeViewHostMsg_V8HeapStats( | |
| 240 total_bytes_, used_bytes_)); | |
| 241 ++round_id_; | |
| 242 } | |
| 243 | |
| 244 } // namespace | 149 } // namespace |
| 245 | 150 |
| 246 bool ChromeRenderProcessObserver::is_incognito_process_ = false; | 151 bool ChromeRenderProcessObserver::is_incognito_process_ = false; |
| 247 | 152 |
| 248 ChromeRenderProcessObserver::ChromeRenderProcessObserver( | 153 ChromeRenderProcessObserver::ChromeRenderProcessObserver( |
| 249 ChromeContentRendererClient* client) | 154 ChromeContentRendererClient* client) |
| 250 : client_(client), | 155 : client_(client), |
| 251 clear_cache_pending_(false), | 156 clear_cache_pending_(false), |
| 252 webkit_initialized_(false), | 157 webkit_initialized_(false), |
| 253 pending_cache_min_dead_capacity_(0), | 158 pending_cache_min_dead_capacity_(0), |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 392 base::FieldTrial* trial = | 297 base::FieldTrial* trial = |
| 393 base::FieldTrialList::CreateFieldTrial(field_trial_name, group_name); | 298 base::FieldTrialList::CreateFieldTrial(field_trial_name, group_name); |
| 394 // TODO(mef): Remove this check after the investigation of 359406 is complete. | 299 // TODO(mef): Remove this check after the investigation of 359406 is complete. |
| 395 CHECK(trial) << field_trial_name << ":" << group_name; | 300 CHECK(trial) << field_trial_name << ":" << group_name; |
| 396 // Ensure the trial is marked as "used" by calling group() on it. This is | 301 // Ensure the trial is marked as "used" by calling group() on it. This is |
| 397 // needed to ensure the trial is properly reported in renderer crash reports. | 302 // needed to ensure the trial is properly reported in renderer crash reports. |
| 398 trial->group(); | 303 trial->group(); |
| 399 chrome_variations::SetChildProcessLoggingVariationList(); | 304 chrome_variations::SetChildProcessLoggingVariationList(); |
| 400 } | 305 } |
| 401 | 306 |
| 307 namespace { |
| 308 |
| 309 void OnV8HeapStatsCollected( |
| 310 const content::V8HeapStatisticsCollector::Statistics& stats) { |
| 311 RenderThread::Get()->Send(new ChromeViewHostMsg_V8HeapStats( |
| 312 stats.total_bytes, stats.used_bytes)); |
| 313 } |
| 314 |
| 315 } // namespace |
| 316 |
| 402 void ChromeRenderProcessObserver::OnGetV8HeapStats() { | 317 void ChromeRenderProcessObserver::OnGetV8HeapStats() { |
| 403 HeapStatisticsCollector::Instance()->InitiateCollection(); | 318 content::V8HeapStatisticsCollector::Instance()->InitiateCollection( |
| 319 base::Bind(OnV8HeapStatsCollected)); |
| 404 } | 320 } |
| 405 | 321 |
| 406 void ChromeRenderProcessObserver::ExecutePendingClearCache() { | 322 void ChromeRenderProcessObserver::ExecutePendingClearCache() { |
| 407 if (clear_cache_pending_ && webkit_initialized_) { | 323 if (clear_cache_pending_ && webkit_initialized_) { |
| 408 clear_cache_pending_ = false; | 324 clear_cache_pending_ = false; |
| 409 WebCache::clear(); | 325 WebCache::clear(); |
| 410 } | 326 } |
| 411 } | 327 } |
| 412 | 328 |
| 413 const RendererContentSettingRules* | 329 const RendererContentSettingRules* |
| 414 ChromeRenderProcessObserver::content_setting_rules() const { | 330 ChromeRenderProcessObserver::content_setting_rules() const { |
| 415 return &content_setting_rules_; | 331 return &content_setting_rules_; |
| 416 } | 332 } |
| OLD | NEW |