Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9876a3bc authored by Tej Singh's avatar Tej Singh
Browse files

Statsd uses ThermalService to pull temperatures

Make statsd use thermal service to pull temperature events. This way we
do not have to directly use thermal hal and manage multiple versions.

Test: adb shell cmd stats pull-source 10021 on blueline-userdebug
Received 8 CPU temps, 2 GPU, 1 skin, 1 battery, 1 usbc, and 1 NPU
Numbers looked reasonable: CPUs were at ~35C, GPU at 34-35, battery at
28, skin at 30, NPU was higher at 43.
Bug: 119228310

Change-Id: Id84b7855bfb91d0439d856a30ad4e40a087f2d4f
parent ee00fea7
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -74,7 +74,6 @@ cc_defaults {
        "src/external/SubsystemSleepStatePuller.cpp",
        "src/external/PowerStatsPuller.cpp",
        "src/external/ResourceHealthManagerPuller.cpp",
        "src/external/ResourceThermalManagerPuller.cpp",
        "src/external/StatsPullerManager.cpp",
        "src/external/puller_util.cpp",
        "src/logd/LogEvent.cpp",
@@ -136,7 +135,6 @@ cc_defaults {
        "android.hardware.power@1.0",
        "android.hardware.power@1.1",
        "android.hardware.power.stats@1.0",
        "android.hardware.thermal@2.0",
        "libpackagelistparser",
        "libsysutils",
        "libcutils",
+2 −2
Original line number Diff line number Diff line
@@ -2744,8 +2744,8 @@ message DiskSpace {

/**
 * Pulls battery coulomb counter, which is the remaining battery charge in uAh.
 * Pulled from:
 *   frameworks/base/cmds/statsd/src/external/ResourceHealthManagerPuller.cpp
 *
 * Pulled from StatsCompanionService.java
 */
message RemainingBatteryCapacity {
    optional int32 charge_micro_ampere_hour = 1;
+0 −147
Original line number Diff line number Diff line
/*
 * Copyright (C) 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#define DEBUG false  // STOPSHIP if true
#include "Log.h"

#include <android/hardware/thermal/2.0/IThermal.h>
#include "external/ResourceThermalManagerPuller.h"
#include "external/StatsPuller.h"

#include "ResourceThermalManagerPuller.h"
#include "logd/LogEvent.h"
#include "statslog.h"
#include "stats_log_util.h"

#include <chrono>

using android::hardware::hidl_death_recipient;
using android::hardware::hidl_vec;
using android::hidl::base::V1_0::IBase;
using ::android::hardware::thermal::V2_0::IThermal;
using ::android::hardware::thermal::V2_0::Temperature;
using ::android::hardware::thermal::V2_0::TemperatureType;
using ::android::hardware::thermal::V1_0::ThermalStatus;
using ::android::hardware::thermal::V1_0::ThermalStatusCode;
using android::hardware::Return;
using android::hardware::Void;

using std::chrono::duration_cast;
using std::chrono::nanoseconds;
using std::chrono::system_clock;
using std::make_shared;
using std::shared_ptr;

namespace android {
namespace os {
namespace statsd {

bool getThermalHalLocked();
sp<android::hardware::thermal::V2_0::IThermal> gThermalHal = nullptr;
std::mutex gThermalHalMutex;

struct ThermalHalDeathRecipient : virtual public hidl_death_recipient {
      virtual void serviceDied(uint64_t cookie, const wp<IBase>& who) override {
          std::lock_guard<std::mutex> lock(gThermalHalMutex);
          ALOGE("ThermalHAL just died");
          gThermalHal = nullptr;
          getThermalHalLocked();
      }
};

sp<ThermalHalDeathRecipient> gThermalHalDeathRecipient = nullptr;

// The caller must be holding gThermalHalMutex.
bool getThermalHalLocked() {
    if (gThermalHal == nullptr) {
            gThermalHal = IThermal::getService();
            if (gThermalHal == nullptr) {
                ALOGE("Unable to get Thermal service.");
            } else {
                if (gThermalHalDeathRecipient == nullptr) {
                    gThermalHalDeathRecipient = new ThermalHalDeathRecipient();
                }
                hardware::Return<bool> linked = gThermalHal->linkToDeath(
                    gThermalHalDeathRecipient, 0x451F /* cookie */);
                if (!linked.isOk()) {
                    ALOGE("Transaction error in linking to ThermalHAL death: %s",
                            linked.description().c_str());
                    gThermalHal = nullptr;
                } else if (!linked) {
                    ALOGW("Unable to link to ThermalHal death notifications");
                    gThermalHal = nullptr;
                } else {
                    ALOGD("Link to death notification successful");
                }
            }
    }
    return gThermalHal != nullptr;
}

ResourceThermalManagerPuller::ResourceThermalManagerPuller() :
        StatsPuller(android::util::TEMPERATURE) {
}

bool ResourceThermalManagerPuller::PullInternal(vector<shared_ptr<LogEvent>>* data) {
    std::lock_guard<std::mutex> lock(gThermalHalMutex);
    if (!getThermalHalLocked()) {
        ALOGE("Thermal Hal not loaded");
        return false;
    }

    int64_t wallClockTimestampNs = getWallClockNs();
    int64_t elapsedTimestampNs = getElapsedRealtimeNs();

    data->clear();
    bool resultSuccess = true;

    Return<void> ret = gThermalHal->getCurrentTemperatures(false, TemperatureType::SKIN,
            [&](ThermalStatus status, const hidl_vec<Temperature>& temps) {
        if (status.code != ThermalStatusCode::SUCCESS) {
            ALOGE("Failed to get temperatures from ThermalHAL. Status: %d", status.code);
            resultSuccess = false;
            return;
        }
        if (mTagId == android::util::TEMPERATURE) {
            for (size_t i = 0; i < temps.size(); ++i) {
                auto ptr = make_shared<LogEvent>(android::util::TEMPERATURE,
                        wallClockTimestampNs, elapsedTimestampNs);
                ptr->write((static_cast<int>(temps[i].type)));
                ptr->write(temps[i].name);
                // Convert the temperature to an int.
                int32_t temp = static_cast<int>(temps[i].value * 10);
                ptr->write(temp);
                ptr->init();
                data->push_back(ptr);
            }
        } else {
            ALOGE("Unsupported tag in ResourceThermalManagerPuller: %d", mTagId);
        }
    });
    if (!ret.isOk()) {
        ALOGE("getThermalHalLocked() failed: thermal HAL service not available. Description: %s",
                ret.description().c_str());
        if (ret.isDeadObject()) {
            gThermalHal = nullptr;
        }
        return false;
    }
    return resultSuccess;
}

}  // namespace statsd
}  // namespace os
}  // namespace android
+0 −39
Original line number Diff line number Diff line
/*
 * Copyright (C) 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#pragma once

#include <utils/String16.h>
#include "StatsPuller.h"

namespace android {
namespace os {
namespace statsd {

/**
 * Reads IThermal.hal
 */
class ResourceThermalManagerPuller : public StatsPuller {
public:
    ResourceThermalManagerPuller();

private:
    bool PullInternal(vector<std::shared_ptr<LogEvent>>* data) override;
};

}  // namespace statsd
}  // namespace os
}  // namespace android
 No newline at end of file
+2 −2
Original line number Diff line number Diff line
@@ -28,7 +28,6 @@
#include "../statscompanion_util.h"
#include "PowerStatsPuller.h"
#include "ResourceHealthManagerPuller.h"
#include "ResourceThermalManagerPuller.h"
#include "StatsCompanionServicePuller.h"
#include "StatsPullerManager.h"
#include "SubsystemSleepStatePuller.h"
@@ -147,7 +146,8 @@ const std::map<int, PullAtomInfo> StatsPullerManager::kAllPullAtomInfo = {
          .puller =
                  new StatsCompanionServicePuller(android::util::PROCESS_MEMORY_HIGH_WATER_MARK)}},
        // temperature
        {android::util::TEMPERATURE, {.puller = new ResourceThermalManagerPuller()}},
        {android::util::TEMPERATURE,
          {.puller = new StatsCompanionServicePuller(android::util::TEMPERATURE)}},
        // binder_calls
        {android::util::BINDER_CALLS,
         {.additiveFields = {4, 5, 6, 8, 12},
Loading