/* * Copyright 2016 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef ThermalManager_DEFINED #define ThermalManager_DEFINED #include "../private/SkTArray.h" #include "SkString.h" #if defined(SK_BUILD_FOR_ANDROID) || defined(SK_BUILD_FOR_UNIX) # define THERMAL_MANAGER_SUPPORTED #endif #ifdef THERMAL_MANAGER_SUPPORTED /* * This simple class monitors the thermal part of sysfs to ensure we don't trigger thermal events */ class ThermalManager { public: ThermalManager(int32_t threshold, uint32_t sleepIntervalMs, uint32_t timeoutMs); bool coolOffIfNecessary(); private: static int32_t OpenFileAndReadInt32(const char* path); // current temperature can be read from /thermalZonePath/temp static int32_t GetTemp(SkString thermalZonePath) { SkString temperatureFilePath(thermalZonePath); temperatureFilePath.appendf("/temp"); return OpenFileAndReadInt32(temperatureFilePath.c_str()); } struct TripPoint { TripPoint(SkString thermalZoneRoot, SkString pointName, int32_t threshold); bool willTrip(); SkString fThermalZoneRoot; SkString fPointName; int32_t fBase; int32_t fPoint; int32_t fThreshold; // Certain trip points seem to start tripped. For example, I have seen trip points of 0 or // negative numbers. bool fDisabled; }; SkTArray<TripPoint> fTripPoints; uint32_t fSleepIntervalMs; uint32_t fTimeoutMs; }; #endif #endif