blob: 4c2da5ba20409131d07189d8b085581102baefa3 [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"
gabb15e19072016-05-11 20:45:4113#include "base/threading/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(
nigeltao48a86032016-11-25 00:04:1617 chrome::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
nigeltao48a86032016-11-25 00:04:1654void ProcessResourceUsage::OnRefreshDone(
55 chrome::mojom::ResourceUsageDataPtr data) {
amistryfaa231a42015-05-20 01:49:1256 DCHECK(thread_checker_.CalledOnValidThread());
57 update_in_progress_ = false;
dchenge73d8520c2015-12-27 01:19:0958 stats_ = std::move(data);
amistry77099c22015-05-20 03:48:5559 RunPendingRefreshCallbacks();
amistryfaa231a42015-05-20 01:49:1260}
61
62bool ProcessResourceUsage::ReportsV8MemoryStats() const {
63 DCHECK(thread_checker_.CalledOnValidThread());
64 if (stats_)
65 return stats_->reports_v8_stats;
66 return false;
67}
68
69size_t ProcessResourceUsage::GetV8MemoryAllocated() const {
70 DCHECK(thread_checker_.CalledOnValidThread());
71 if (stats_ && stats_->reports_v8_stats)
72 return stats_->v8_bytes_allocated;
73 return 0;
74}
75
76size_t ProcessResourceUsage::GetV8MemoryUsed() const {
77 DCHECK(thread_checker_.CalledOnValidThread());
78 if (stats_ && stats_->reports_v8_stats)
79 return stats_->v8_bytes_used;
80 return 0;
81}
amistry9e2a8b42015-06-13 01:11:2782
83blink::WebCache::ResourceTypeStats ProcessResourceUsage::GetWebCoreCacheStats()
84 const {
85 DCHECK(thread_checker_.CalledOnValidThread());
86 if (stats_ && stats_->web_cache_stats)
87 return stats_->web_cache_stats->To<blink::WebCache::ResourceTypeStats>();
88 return {};
89}