Index: services/resource_coordinator/coordination_unit/process_coordination_unit_impl.cc |
diff --git a/services/resource_coordinator/coordination_unit/process_coordination_unit_impl.cc b/services/resource_coordinator/coordination_unit/process_coordination_unit_impl.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d8979ab787da0800c627aeb831bd502bc4af3cd0 |
--- /dev/null |
+++ b/services/resource_coordinator/coordination_unit/process_coordination_unit_impl.cc |
@@ -0,0 +1,60 @@ |
+// Copyright 2017 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 "services/resource_coordinator/coordination_unit/process_coordination_unit_impl.h" |
+#include "base/process/process_handle.h" |
+#include "base/process/process_metrics.h" |
+#include "base/time/time.h" |
+#include "services/resource_coordinator/public/cpp/coordination_unit_id.h" |
+#include "services/service_manager/public/cpp/service_context_ref.h" |
+ |
+#if defined(OS_MACOSX) |
+#include "services/service_manager/public/cpp/standalone_service/mach_broker.h" |
+#endif |
+ |
+namespace resource_coordinator { |
+ |
+namespace { |
+ |
+const int kCPUProfilingIntervalInSeconds = 5; |
+ |
+} // namespace |
+ |
+ProcessCoordinationUnitImpl::ProcessCoordinationUnitImpl( |
+ const CoordinationUnitID& id, |
+ std::unique_ptr<service_manager::ServiceContextRef> service_ref) |
+ : CoordinationUnitImpl(id, std::move(service_ref)), cpu_usage_(-1.0) { |
+ // ProcessCoordinationUnit ids should correspond to its pid |
+ base::ProcessHandle pid = id.id; |
+ |
+#if defined(OS_MACOSX) |
+ process_metrics_ = base::ProcessMetrics::CreateProcessMetrics( |
+ pid, service_manager::MachBroker::GetInstance()->port_provider()); |
+#else |
+ process_metrics_ = base::ProcessMetrics::CreateProcessMetrics(pid); |
+#endif |
+ |
+ ScheduleProcessCPUProfiling(base::TimeDelta()); |
+} |
+ |
+ProcessCoordinationUnitImpl::~ProcessCoordinationUnitImpl() {} |
+ |
+void ProcessCoordinationUnitImpl::ScheduleProcessCPUProfiling( |
+ base::TimeDelta delay) { |
+ repeating_timer_.Start(FROM_HERE, delay, this, |
+ &ProcessCoordinationUnitImpl::MeasureProcessCPUUsage); |
+} |
+ |
+void ProcessCoordinationUnitImpl::MeasureProcessCPUUsage() { |
+ cpu_usage_ = process_metrics_->GetPlatformIndependentCPUUsage(); |
+ |
+ ScheduleProcessCPUProfiling( |
+ base::TimeDelta::FromSeconds(kCPUProfilingIntervalInSeconds)); |
+} |
+ |
+double ProcessCoordinationUnitImpl::GetCPUUsageForTesting() { |
+ return cpu_usage_; |
+} |
+ |
+} // namespace resource_coordinator |