Index: components/arc/metrics/arc_metrics_service.cc |
diff --git a/components/arc/metrics/arc_metrics_service.cc b/components/arc/metrics/arc_metrics_service.cc |
index 5ce5aa101ae122fde893bef49e0a3be45daae846..9aca98bd08402b742530c24ac060b086e6783d04 100644 |
--- a/components/arc/metrics/arc_metrics_service.cc |
+++ b/components/arc/metrics/arc_metrics_service.cc |
@@ -4,6 +4,8 @@ |
#include "components/arc/metrics/arc_metrics_service.h" |
+#include <string> |
+ |
#include "base/logging.h" |
#include "base/metrics/histogram_macros.h" |
#include "base/strings/string_util.h" |
@@ -17,19 +19,24 @@ const char kArcProcessNamePrefix[] = "org.chromium.arc."; |
const char kGmsProcessNamePrefix[] = "com.google.android.gms"; |
const char kBootProgressEnableScreen[] = "boot_progress_enable_screen"; |
-} // namespace |
+} // namespace |
namespace arc { |
ArcMetricsService::ArcMetricsService(ArcBridgeService* bridge_service) |
- : ArcService(bridge_service), binding_(this), weak_ptr_factory_(this) { |
- arc_bridge_service()->AddObserver(this); |
+ : ArcService(bridge_service), |
+ binding_(this), |
+ process_observer_(this), |
+ weak_ptr_factory_(this) { |
+ arc_bridge_service()->metrics()->AddObserver(this); |
+ arc_bridge_service()->process()->AddObserver(&process_observer_); |
oom_kills_monitor_.Start(); |
} |
ArcMetricsService::~ArcMetricsService() { |
DCHECK(CalledOnValidThread()); |
- arc_bridge_service()->RemoveObserver(this); |
+ arc_bridge_service()->process()->RemoveObserver(&process_observer_); |
+ arc_bridge_service()->metrics()->RemoveObserver(this); |
} |
bool ArcMetricsService::CalledOnValidThread() { |
@@ -37,7 +44,7 @@ bool ArcMetricsService::CalledOnValidThread() { |
return thread_checker_.CalledOnValidThread(); |
} |
-void ArcMetricsService::OnMetricsInstanceReady() { |
+void ArcMetricsService::OnInstanceReady() { |
VLOG(2) << "Start metrics service."; |
// Retrieve ARC start time from session manager. |
chromeos::SessionManagerClient* session_manager_client = |
@@ -47,7 +54,7 @@ void ArcMetricsService::OnMetricsInstanceReady() { |
weak_ptr_factory_.GetWeakPtr())); |
} |
-void ArcMetricsService::OnMetricsInstanceClosed() { |
+void ArcMetricsService::OnInstanceClosed() { |
VLOG(2) << "Close metrics service."; |
DCHECK(CalledOnValidThread()); |
if (binding_.is_bound()) |
@@ -56,11 +63,9 @@ void ArcMetricsService::OnMetricsInstanceClosed() { |
void ArcMetricsService::OnProcessInstanceReady() { |
VLOG(2) << "Start updating process list."; |
- timer_.Start( |
- FROM_HERE, |
- base::TimeDelta::FromMinutes(kRequestProcessListPeriodInMinutes), |
- this, |
- &ArcMetricsService::RequestProcessList); |
+ timer_.Start(FROM_HERE, |
+ base::TimeDelta::FromMinutes(kRequestProcessListPeriodInMinutes), |
+ this, &ArcMetricsService::RequestProcessList); |
} |
void ArcMetricsService::OnProcessInstanceClosed() { |
@@ -70,16 +75,15 @@ void ArcMetricsService::OnProcessInstanceClosed() { |
void ArcMetricsService::RequestProcessList() { |
mojom::ProcessInstance* process_instance = |
- arc_bridge_service()->process_instance(); |
+ arc_bridge_service()->process()->instance(); |
if (!process_instance) { |
LOG(ERROR) << "No process instance found before RequestProcessList"; |
return; |
} |
VLOG(2) << "RequestProcessList"; |
- process_instance->RequestProcessList( |
- base::Bind(&ArcMetricsService::ParseProcessList, |
- weak_ptr_factory_.GetWeakPtr())); |
+ process_instance->RequestProcessList(base::Bind( |
+ &ArcMetricsService::ParseProcessList, weak_ptr_factory_.GetWeakPtr())); |
} |
void ArcMetricsService::ParseProcessList( |
@@ -109,12 +113,17 @@ void ArcMetricsService::ParseProcessList( |
} |
void ArcMetricsService::OnArcStartTimeRetrieved( |
- bool success, base::TimeTicks arc_start_time) { |
+ bool success, |
+ base::TimeTicks arc_start_time) { |
DCHECK(CalledOnValidThread()); |
if (!success) { |
LOG(ERROR) << "Failed to retrieve ARC start timeticks."; |
return; |
} |
+ if (!arc_bridge_service()->metrics()->instance()) { |
+ LOG(ERROR) << "ARC metrics instance went away while retrieving start time."; |
+ return; |
+ } |
// The binding of host interface is deferred until the ARC start time is |
// retrieved here because it prevents race condition of the ARC start |
@@ -122,7 +131,7 @@ void ArcMetricsService::OnArcStartTimeRetrieved( |
if (!binding_.is_bound()) { |
mojom::MetricsHostPtr host_ptr; |
binding_.Bind(mojo::GetProxy(&host_ptr)); |
- arc_bridge_service()->metrics_instance()->Init(std::move(host_ptr)); |
+ arc_bridge_service()->metrics()->instance()->Init(std::move(host_ptr)); |
} |
arc_start_time_ = arc_start_time; |
VLOG(2) << "ARC start @" << arc_start_time_; |
@@ -134,27 +143,36 @@ void ArcMetricsService::ReportBootProgress( |
int64_t arc_start_time_in_ms = |
(arc_start_time_ - base::TimeTicks()).InMilliseconds(); |
for (const auto& event : events) { |
- VLOG(2) << "Report boot progress event:" |
- << event->event << "@" << event->uptimeMillis; |
+ VLOG(2) << "Report boot progress event:" << event->event << "@" |
+ << event->uptimeMillis; |
std::string title = "Arc." + event->event.get(); |
base::TimeDelta elapsed_time = base::TimeDelta::FromMilliseconds( |
event->uptimeMillis - arc_start_time_in_ms); |
// Note: This leaks memory, which is expected behavior. |
- base::HistogramBase* histogram = |
- base::Histogram::FactoryTimeGet( |
- title, |
- base::TimeDelta::FromMilliseconds(1), |
- base::TimeDelta::FromSeconds(30), |
- 50, |
- base::HistogramBase::kUmaTargetedHistogramFlag); |
+ base::HistogramBase* histogram = base::Histogram::FactoryTimeGet( |
+ title, base::TimeDelta::FromMilliseconds(1), |
+ base::TimeDelta::FromSeconds(30), 50, |
+ base::HistogramBase::kUmaTargetedHistogramFlag); |
histogram->AddTime(elapsed_time); |
if (event->event.get().compare(kBootProgressEnableScreen) == 0) |
- UMA_HISTOGRAM_CUSTOM_TIMES("Arc.AndroidBootTime", |
- elapsed_time, |
+ UMA_HISTOGRAM_CUSTOM_TIMES("Arc.AndroidBootTime", elapsed_time, |
base::TimeDelta::FromMilliseconds(1), |
- base::TimeDelta::FromSeconds(30), |
- 50); |
+ base::TimeDelta::FromSeconds(30), 50); |
} |
} |
+ArcMetricsService::ProcessObserver::ProcessObserver( |
+ ArcMetricsService* arc_metrics_service) |
+ : arc_metrics_service_(arc_metrics_service) {} |
+ |
+ArcMetricsService::ProcessObserver::~ProcessObserver() = default; |
+ |
+void ArcMetricsService::ProcessObserver::OnInstanceReady() { |
+ arc_metrics_service_->OnProcessInstanceReady(); |
+} |
+ |
+void ArcMetricsService::ProcessObserver::OnInstanceClosed() { |
+ arc_metrics_service_->OnProcessInstanceClosed(); |
+} |
+ |
} // namespace arc |