amistry | faa231a4 | 2015-05-20 01:49:12 | [diff] [blame] | 1 | // 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 | |
dcheng | e73d8520c | 2015-12-27 01:19:09 | [diff] [blame] | 7 | #include <utility> |
| 8 | |
amistry | faa231a4 | 2015-05-20 01:49:12 | [diff] [blame] | 9 | #include "base/bind.h" |
amistry | 77099c2 | 2015-05-20 03:48:55 | [diff] [blame] | 10 | #include "base/location.h" |
amistry | faa231a4 | 2015-05-20 01:49:12 | [diff] [blame] | 11 | #include "base/logging.h" |
skyostil | 0259835 | 2015-06-12 12:37:25 | [diff] [blame] | 12 | #include "base/single_thread_task_runner.h" |
gab | b15e1907 | 2016-05-11 20:45:41 | [diff] [blame] | 13 | #include "base/threading/thread_task_runner_handle.h" |
amistry | 9e2a8b4 | 2015-06-13 01:11:27 | [diff] [blame] | 14 | #include "chrome/common/resource_usage_reporter_type_converters.h" |
amistry | faa231a4 | 2015-05-20 01:49:12 | [diff] [blame] | 15 | |
leon.han | b4c77076 | 2016-04-06 05:52:04 | [diff] [blame] | 16 | ProcessResourceUsage::ProcessResourceUsage( |
nigeltao | 48a8603 | 2016-11-25 00:04:16 | [diff] [blame] | 17 | chrome::mojom::ResourceUsageReporterPtr service) |
dcheng | e73d8520c | 2015-12-27 01:19:09 | [diff] [blame] | 18 | : service_(std::move(service)), update_in_progress_(false) { |
amistry | 85f8564 | 2015-07-02 01:42:52 | [diff] [blame] | 19 | service_.set_connection_error_handler( |
| 20 | base::Bind(&ProcessResourceUsage::RunPendingRefreshCallbacks, |
| 21 | base::Unretained(this))); |
amistry | faa231a4 | 2015-05-20 01:49:12 | [diff] [blame] | 22 | } |
| 23 | |
| 24 | ProcessResourceUsage::~ProcessResourceUsage() { |
| 25 | DCHECK(thread_checker_.CalledOnValidThread()); |
| 26 | } |
| 27 | |
amistry | 77099c2 | 2015-05-20 03:48:55 | [diff] [blame] | 28 | void ProcessResourceUsage::RunPendingRefreshCallbacks() { |
amistry | faa231a4 | 2015-05-20 01:49:12 | [diff] [blame] | 29 | DCHECK(thread_checker_.CalledOnValidThread()); |
skyostil | 0259835 | 2015-06-12 12:37:25 | [diff] [blame] | 30 | auto task_runner = base::ThreadTaskRunnerHandle::Get(); |
amistry | 77099c2 | 2015-05-20 03:48:55 | [diff] [blame] | 31 | for (const auto& callback : refresh_callbacks_) |
skyostil | 0259835 | 2015-06-12 12:37:25 | [diff] [blame] | 32 | task_runner->PostTask(FROM_HERE, callback); |
amistry | 77099c2 | 2015-05-20 03:48:55 | [diff] [blame] | 33 | refresh_callbacks_.clear(); |
| 34 | } |
| 35 | |
| 36 | void ProcessResourceUsage::Refresh(const base::Closure& callback) { |
| 37 | DCHECK(thread_checker_.CalledOnValidThread()); |
| 38 | if (!service_ || service_.encountered_error()) { |
| 39 | if (!callback.is_null()) |
skyostil | 0259835 | 2015-06-12 12:37:25 | [diff] [blame] | 40 | base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, callback); |
amistry | 77099c2 | 2015-05-20 03:48:55 | [diff] [blame] | 41 | return; |
| 42 | } |
| 43 | |
| 44 | if (!callback.is_null()) |
| 45 | refresh_callbacks_.push_back(callback); |
| 46 | |
| 47 | if (!update_in_progress_) { |
amistry | faa231a4 | 2015-05-20 01:49:12 | [diff] [blame] | 48 | update_in_progress_ = true; |
| 49 | service_->GetUsageData(base::Bind(&ProcessResourceUsage::OnRefreshDone, |
| 50 | base::Unretained(this))); |
| 51 | } |
| 52 | } |
| 53 | |
nigeltao | 48a8603 | 2016-11-25 00:04:16 | [diff] [blame] | 54 | void ProcessResourceUsage::OnRefreshDone( |
| 55 | chrome::mojom::ResourceUsageDataPtr data) { |
amistry | faa231a4 | 2015-05-20 01:49:12 | [diff] [blame] | 56 | DCHECK(thread_checker_.CalledOnValidThread()); |
| 57 | update_in_progress_ = false; |
dcheng | e73d8520c | 2015-12-27 01:19:09 | [diff] [blame] | 58 | stats_ = std::move(data); |
amistry | 77099c2 | 2015-05-20 03:48:55 | [diff] [blame] | 59 | RunPendingRefreshCallbacks(); |
amistry | faa231a4 | 2015-05-20 01:49:12 | [diff] [blame] | 60 | } |
| 61 | |
| 62 | bool ProcessResourceUsage::ReportsV8MemoryStats() const { |
| 63 | DCHECK(thread_checker_.CalledOnValidThread()); |
| 64 | if (stats_) |
| 65 | return stats_->reports_v8_stats; |
| 66 | return false; |
| 67 | } |
| 68 | |
| 69 | size_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 | |
| 76 | size_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 | } |
amistry | 9e2a8b4 | 2015-06-13 01:11:27 | [diff] [blame] | 82 | |
| 83 | blink::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 | } |