OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 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 | 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/browser/process_resource_usage.h" | 5 #include "chrome/browser/process_resource_usage.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/location.h" |
8 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/message_loop/message_loop_proxy.h" |
| 11 #include "third_party/mojo/src/mojo/public/cpp/bindings/error_handler.h" |
| 12 |
| 13 class ProcessResourceUsage::ErrorHandler : public mojo::ErrorHandler { |
| 14 public: |
| 15 ErrorHandler(ProcessResourceUsage* usage) : usage_(usage) {} |
| 16 |
| 17 // mojo::ErrorHandler implementation: |
| 18 void OnConnectionError() override; |
| 19 |
| 20 private: |
| 21 ProcessResourceUsage* usage_; // Not owned. |
| 22 }; |
| 23 |
| 24 void ProcessResourceUsage::ErrorHandler::OnConnectionError() { |
| 25 usage_->RunPendingRefreshCallbacks(); |
| 26 } |
9 | 27 |
10 ProcessResourceUsage::ProcessResourceUsage(ResourceUsageReporterPtr service) | 28 ProcessResourceUsage::ProcessResourceUsage(ResourceUsageReporterPtr service) |
11 : service_(service.Pass()), update_in_progress_(false) { | 29 : service_(service.Pass()), |
| 30 update_in_progress_(false), |
| 31 error_handler_(new ErrorHandler(this)) { |
| 32 service_.set_error_handler(error_handler_.get()); |
12 } | 33 } |
13 | 34 |
14 ProcessResourceUsage::~ProcessResourceUsage() { | 35 ProcessResourceUsage::~ProcessResourceUsage() { |
15 DCHECK(thread_checker_.CalledOnValidThread()); | 36 DCHECK(thread_checker_.CalledOnValidThread()); |
16 } | 37 } |
17 | 38 |
18 void ProcessResourceUsage::Refresh() { | 39 void ProcessResourceUsage::RunPendingRefreshCallbacks() { |
19 DCHECK(thread_checker_.CalledOnValidThread()); | 40 DCHECK(thread_checker_.CalledOnValidThread()); |
20 if (!update_in_progress_ && service_) { | 41 auto message_loop = base::MessageLoopProxy::current(); |
| 42 for (const auto& callback : refresh_callbacks_) |
| 43 message_loop->PostTask(FROM_HERE, callback); |
| 44 refresh_callbacks_.clear(); |
| 45 } |
| 46 |
| 47 void ProcessResourceUsage::Refresh(const base::Closure& callback) { |
| 48 DCHECK(thread_checker_.CalledOnValidThread()); |
| 49 if (!service_ || service_.encountered_error()) { |
| 50 if (!callback.is_null()) |
| 51 base::MessageLoopProxy::current()->PostTask(FROM_HERE, callback); |
| 52 return; |
| 53 } |
| 54 |
| 55 if (!callback.is_null()) |
| 56 refresh_callbacks_.push_back(callback); |
| 57 |
| 58 if (!update_in_progress_) { |
21 update_in_progress_ = true; | 59 update_in_progress_ = true; |
22 service_->GetUsageData(base::Bind(&ProcessResourceUsage::OnRefreshDone, | 60 service_->GetUsageData(base::Bind(&ProcessResourceUsage::OnRefreshDone, |
23 base::Unretained(this))); | 61 base::Unretained(this))); |
24 } | 62 } |
25 } | 63 } |
26 | 64 |
27 void ProcessResourceUsage::OnRefreshDone(ResourceUsageDataPtr data) { | 65 void ProcessResourceUsage::OnRefreshDone(ResourceUsageDataPtr data) { |
28 DCHECK(thread_checker_.CalledOnValidThread()); | 66 DCHECK(thread_checker_.CalledOnValidThread()); |
29 update_in_progress_ = false; | 67 update_in_progress_ = false; |
30 stats_ = data.Pass(); | 68 stats_ = data.Pass(); |
| 69 RunPendingRefreshCallbacks(); |
31 } | 70 } |
32 | 71 |
33 bool ProcessResourceUsage::ReportsV8MemoryStats() const { | 72 bool ProcessResourceUsage::ReportsV8MemoryStats() const { |
34 DCHECK(thread_checker_.CalledOnValidThread()); | 73 DCHECK(thread_checker_.CalledOnValidThread()); |
35 if (stats_) | 74 if (stats_) |
36 return stats_->reports_v8_stats; | 75 return stats_->reports_v8_stats; |
37 return false; | 76 return false; |
38 } | 77 } |
39 | 78 |
40 size_t ProcessResourceUsage::GetV8MemoryAllocated() const { | 79 size_t ProcessResourceUsage::GetV8MemoryAllocated() const { |
41 DCHECK(thread_checker_.CalledOnValidThread()); | 80 DCHECK(thread_checker_.CalledOnValidThread()); |
42 if (stats_ && stats_->reports_v8_stats) | 81 if (stats_ && stats_->reports_v8_stats) |
43 return stats_->v8_bytes_allocated; | 82 return stats_->v8_bytes_allocated; |
44 return 0; | 83 return 0; |
45 } | 84 } |
46 | 85 |
47 size_t ProcessResourceUsage::GetV8MemoryUsed() const { | 86 size_t ProcessResourceUsage::GetV8MemoryUsed() const { |
48 DCHECK(thread_checker_.CalledOnValidThread()); | 87 DCHECK(thread_checker_.CalledOnValidThread()); |
49 if (stats_ && stats_->reports_v8_stats) | 88 if (stats_ && stats_->reports_v8_stats) |
50 return stats_->v8_bytes_used; | 89 return stats_->v8_bytes_used; |
51 return 0; | 90 return 0; |
52 } | 91 } |
OLD | NEW |