blob: a348df80d8cf8bd729eab917822dd8f8f7fead49 [file] [log] [blame]
amistryfaa231a42015-05-20 01:49:121// Copyright 2015 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/process_resource_usage.h"
6
dchenge73d8520c2015-12-27 01:19:097#include <utility>
8
amistryfaa231a42015-05-20 01:49:129#include "base/bind.h"
amistry77099c22015-05-20 03:48:5510#include "base/location.h"
amistryfaa231a42015-05-20 01:49:1211#include "base/logging.h"
skyostil02598352015-06-12 12:37:2512#include "base/single_thread_task_runner.h"
13#include "base/thread_task_runner_handle.h"
amistry9e2a8b42015-06-13 01:11:2714#include "chrome/common/resource_usage_reporter_type_converters.h"
amistryfaa231a42015-05-20 01:49:1215
leon.hanb4c770762016-04-06 05:52:0416ProcessResourceUsage::ProcessResourceUsage(
17 mojom::ResourceUsageReporterPtr service)
dchenge73d8520c2015-12-27 01:19:0918 : service_(std::move(service)), update_in_progress_(false) {
amistry85f85642015-07-02 01:42:5219 service_.set_connection_error_handler(
20 base::Bind(&ProcessResourceUsage::RunPendingRefreshCallbacks,
21 base::Unretained(this)));
amistryfaa231a42015-05-20 01:49:1222}
23
24ProcessResourceUsage::~ProcessResourceUsage() {
25 DCHECK(thread_checker_.CalledOnValidThread());
26}
27
amistry77099c22015-05-20 03:48:5528void ProcessResourceUsage::RunPendingRefreshCallbacks() {
amistryfaa231a42015-05-20 01:49:1229 DCHECK(thread_checker_.CalledOnValidThread());
skyostil02598352015-06-12 12:37:2530 auto task_runner = base::ThreadTaskRunnerHandle::Get();
amistry77099c22015-05-20 03:48:5531 for (const auto& callback : refresh_callbacks_)
skyostil02598352015-06-12 12:37:2532 task_runner->PostTask(FROM_HERE, callback);
amistry77099c22015-05-20 03:48:5533 refresh_callbacks_.clear();
34}
35
36void ProcessResourceUsage::Refresh(const base::Closure& callback) {
37 DCHECK(thread_checker_.CalledOnValidThread());
38 if (!service_ || service_.encountered_error()) {
39 if (!callback.is_null())
skyostil02598352015-06-12 12:37:2540 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, callback);
amistry77099c22015-05-20 03:48:5541 return;
42 }
43
44 if (!callback.is_null())
45 refresh_callbacks_.push_back(callback);
46
47 if (!update_in_progress_) {
amistryfaa231a42015-05-20 01:49:1248 update_in_progress_ = true;
49 service_->GetUsageData(base::Bind(&ProcessResourceUsage::OnRefreshDone,
50 base::Unretained(this)));
51 }
52}
53
leon.hanb4c770762016-04-06 05:52:0454void ProcessResourceUsage::OnRefreshDone(mojom::ResourceUsageDataPtr data) {
amistryfaa231a42015-05-20 01:49:1255 DCHECK(thread_checker_.CalledOnValidThread());
56 update_in_progress_ = false;
dchenge73d8520c2015-12-27 01:19:0957 stats_ = std::move(data);
amistry77099c22015-05-20 03:48:5558 RunPendingRefreshCallbacks();
amistryfaa231a42015-05-20 01:49:1259}
60
61bool ProcessResourceUsage::ReportsV8MemoryStats() const {
62 DCHECK(thread_checker_.CalledOnValidThread());
63 if (stats_)
64 return stats_->reports_v8_stats;
65 return false;
66}
67
68size_t ProcessResourceUsage::GetV8MemoryAllocated() const {
69 DCHECK(thread_checker_.CalledOnValidThread());
70 if (stats_ && stats_->reports_v8_stats)
71 return stats_->v8_bytes_allocated;
72 return 0;
73}
74
75size_t ProcessResourceUsage::GetV8MemoryUsed() const {
76 DCHECK(thread_checker_.CalledOnValidThread());
77 if (stats_ && stats_->reports_v8_stats)
78 return stats_->v8_bytes_used;
79 return 0;
80}
amistry9e2a8b42015-06-13 01:11:2781
82blink::WebCache::ResourceTypeStats ProcessResourceUsage::GetWebCoreCacheStats()
83 const {
84 DCHECK(thread_checker_.CalledOnValidThread());
85 if (stats_ && stats_->web_cache_stats)
86 return stats_->web_cache_stats->To<blink::WebCache::ResourceTypeStats>();
87 return {};
88}