blob: 54b81aaafee627513ce7580649f1e524ca87330e [file] [log] [blame]
// Copyright 2020 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 "base/power_monitor/thermal_state_observer_mac.h"
#import <Foundation/Foundation.h>
#include "base/logging.h"
#include "base/power_monitor/power_monitor.h"
#include "base/power_monitor/power_monitor_source.h"
namespace {
base::PowerObserver::DeviceThermalState
NSProcessInfoThermalStateToDeviceThermalState(
NSProcessInfoThermalState nsinfo_state) NS_AVAILABLE_MAC(10_10_3) {
switch (nsinfo_state) {
case NSProcessInfoThermalStateNominal:
return base::PowerObserver::DeviceThermalState::kNominal;
case NSProcessInfoThermalStateFair:
return base::PowerObserver::DeviceThermalState::kFair;
case NSProcessInfoThermalStateSerious:
return base::PowerObserver::DeviceThermalState::kSerious;
case NSProcessInfoThermalStateCritical:
return base::PowerObserver::DeviceThermalState::kCritical;
}
NOTREACHED();
return base::PowerObserver::DeviceThermalState::kUnknown;
}
}
namespace base {
ThermalStateObserverMac::ThermalStateObserverMac(
StateUpdateCallback state_update_callback) NS_AVAILABLE_MAC(10_10_3) {
auto on_state_change_block = ^(NSNotification* notification) {
auto state = PowerObserver::DeviceThermalState::kUnknown;
// |thermalState| is basically a scale of power usage and its associated
// thermal dissipation increase, from Nominal upwards, see:
// https://developer.apple.com/library/archive/documentation/Performance/Conceptual/power_efficiency_guidelines_osx/RespondToThermalStateChanges.html
NSProcessInfoThermalState nsinfo_state =
[[NSProcessInfo processInfo] thermalState];
state = NSProcessInfoThermalStateToDeviceThermalState(nsinfo_state);
if (state_for_testing_ != PowerObserver::DeviceThermalState::kUnknown)
state = state_for_testing_;
DVLOG(1) << __func__ << ": "
<< PowerMonitorSource::DeviceThermalStateToString(state);
state_update_callback.Run(state);
};
thermal_state_update_observer_ = [[NSNotificationCenter defaultCenter]
addObserverForName:NSProcessInfoThermalStateDidChangeNotification
object:nil
queue:nil
usingBlock:on_state_change_block];
// Force a first call to grab the current status.
on_state_change_block(nil);
}
ThermalStateObserverMac::~ThermalStateObserverMac() {
[[NSNotificationCenter defaultCenter]
removeObserver:thermal_state_update_observer_];
}
PowerObserver::DeviceThermalState
ThermalStateObserverMac::GetCurrentThermalState() NS_AVAILABLE_MAC(10_10_3) {
if (state_for_testing_ != PowerObserver::DeviceThermalState::kUnknown)
return state_for_testing_;
NSProcessInfoThermalState nsinfo_state =
[[NSProcessInfo processInfo] thermalState];
return NSProcessInfoThermalStateToDeviceThermalState(nsinfo_state);
}
}