blob: 27413c60f10b685431216f9ceccbd4b176cc6a3a [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#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),
error_handler_(new ErrorHandler(this)) {
service_.set_error_handler(error_handler_.get());
}
ProcessResourceUsage::~ProcessResourceUsage() {
DCHECK(thread_checker_.CalledOnValidThread());
}
void ProcessResourceUsage::RunPendingRefreshCallbacks() {
DCHECK(thread_checker_.CalledOnValidThread());
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)));
}
}
void ProcessResourceUsage::OnRefreshDone(ResourceUsageDataPtr data) {
DCHECK(thread_checker_.CalledOnValidThread());
update_in_progress_ = false;
stats_ = data.Pass();
RunPendingRefreshCallbacks();
}
bool ProcessResourceUsage::ReportsV8MemoryStats() const {
DCHECK(thread_checker_.CalledOnValidThread());
if (stats_)
return stats_->reports_v8_stats;
return false;
}
size_t ProcessResourceUsage::GetV8MemoryAllocated() const {
DCHECK(thread_checker_.CalledOnValidThread());
if (stats_ && stats_->reports_v8_stats)
return stats_->v8_bytes_allocated;
return 0;
}
size_t ProcessResourceUsage::GetV8MemoryUsed() const {
DCHECK(thread_checker_.CalledOnValidThread());
if (stats_ && stats_->reports_v8_stats)
return stats_->v8_bytes_used;
return 0;
}