| 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 |