| Index: chrome/browser/process_resource_usage.cc
|
| diff --git a/chrome/browser/process_resource_usage.cc b/chrome/browser/process_resource_usage.cc
|
| index f892ade2f1f2a42d4093c2dba2de2c6058b8c2d3..27413c60f10b685431216f9ceccbd4b176cc6a3a 100644
|
| --- a/chrome/browser/process_resource_usage.cc
|
| +++ b/chrome/browser/process_resource_usage.cc
|
| @@ -5,19 +5,57 @@
|
| #include "chrome/browser/process_resource_usage.h"
|
|
|
| #include "base/bind.h"
|
| +#include "base/location.h"
|
| #include "base/logging.h"
|
| +#include "base/message_loop/message_loop_proxy.h"
|
| +#include "third_party/mojo/src/mojo/public/cpp/bindings/error_handler.h"
|
| +
|
| +class ProcessResourceUsage::ErrorHandler : public mojo::ErrorHandler {
|
| + public:
|
| + ErrorHandler(ProcessResourceUsage* usage) : usage_(usage) {}
|
| +
|
| + // mojo::ErrorHandler implementation:
|
| + void OnConnectionError() override;
|
| +
|
| + private:
|
| + ProcessResourceUsage* usage_; // Not owned.
|
| +};
|
| +
|
| +void ProcessResourceUsage::ErrorHandler::OnConnectionError() {
|
| + usage_->RunPendingRefreshCallbacks();
|
| +}
|
|
|
| ProcessResourceUsage::ProcessResourceUsage(ResourceUsageReporterPtr service)
|
| - : service_(service.Pass()), update_in_progress_(false) {
|
| + : service_(service.Pass()),
|
| + update_in_progress_(false),
|
| + error_handler_(new ErrorHandler(this)) {
|
| + service_.set_error_handler(error_handler_.get());
|
| }
|
|
|
| ProcessResourceUsage::~ProcessResourceUsage() {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| }
|
|
|
| -void ProcessResourceUsage::Refresh() {
|
| +void ProcessResourceUsage::RunPendingRefreshCallbacks() {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| - if (!update_in_progress_ && service_) {
|
| + auto message_loop = base::MessageLoopProxy::current();
|
| + for (const auto& callback : refresh_callbacks_)
|
| + message_loop->PostTask(FROM_HERE, callback);
|
| + refresh_callbacks_.clear();
|
| +}
|
| +
|
| +void ProcessResourceUsage::Refresh(const base::Closure& callback) {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + if (!service_ || service_.encountered_error()) {
|
| + if (!callback.is_null())
|
| + base::MessageLoopProxy::current()->PostTask(FROM_HERE, callback);
|
| + return;
|
| + }
|
| +
|
| + if (!callback.is_null())
|
| + refresh_callbacks_.push_back(callback);
|
| +
|
| + if (!update_in_progress_) {
|
| update_in_progress_ = true;
|
| service_->GetUsageData(base::Bind(&ProcessResourceUsage::OnRefreshDone,
|
| base::Unretained(this)));
|
| @@ -28,6 +66,7 @@ void ProcessResourceUsage::OnRefreshDone(ResourceUsageDataPtr data) {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| update_in_progress_ = false;
|
| stats_ = data.Pass();
|
| + RunPendingRefreshCallbacks();
|
| }
|
|
|
| bool ProcessResourceUsage::ReportsV8MemoryStats() const {
|
|
|