cpu_probe_mac.cc 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. // Copyright 2022 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "services/device/compute_pressure/cpu_probe_mac.h"
  5. #include "base/check_op.h"
  6. #include "base/memory/ptr_util.h"
  7. namespace device {
  8. // static
  9. std::unique_ptr<CpuProbeMac> CpuProbeMac::Create() {
  10. return base::WrapUnique(new CpuProbeMac());
  11. }
  12. CpuProbeMac::CpuProbeMac() {
  13. DETACH_FROM_SEQUENCE(sequence_checker_);
  14. }
  15. CpuProbeMac::~CpuProbeMac() {
  16. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  17. }
  18. void CpuProbeMac::Update() {
  19. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  20. processor_info_scanner_.Update();
  21. const std::vector<CoreTimes>& per_core_times =
  22. processor_info_scanner_.core_times();
  23. double utilization_sum = 0.0;
  24. int utilization_cores = 0;
  25. for (size_t i = 0; i < per_core_times.size(); ++i) {
  26. DCHECK_GE(last_per_core_times_.size(), i);
  27. const CoreTimes& core_times = per_core_times[i];
  28. if (last_per_core_times_.size() == i) {
  29. InitializeCore(i, core_times);
  30. continue;
  31. }
  32. double core_utilization =
  33. core_times.TimeUtilization(last_per_core_times_[i]);
  34. if (core_utilization >= 0) {
  35. // Only overwrite `last_per_core_times_` if the cpu time counters are
  36. // monotonically increasing. Otherwise, discard the measurement.
  37. last_per_core_times_[i] = core_times;
  38. utilization_sum += core_utilization;
  39. ++utilization_cores;
  40. }
  41. }
  42. if (utilization_cores > 0) {
  43. last_sample_.cpu_utilization = utilization_sum / utilization_cores;
  44. } else {
  45. last_sample_ = kUnsupportedValue;
  46. }
  47. }
  48. PressureSample CpuProbeMac::LastSample() {
  49. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  50. return last_sample_;
  51. }
  52. void CpuProbeMac::InitializeCore(size_t core_index,
  53. const CoreTimes& initial_core_times) {
  54. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  55. DCHECK_EQ(last_per_core_times_.size(), core_index);
  56. last_per_core_times_.push_back(initial_core_times);
  57. }
  58. } // namespace device