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

Commit 6af5b8c4 authored by Matt Buckley's avatar Matt Buckley
Browse files

Update HintManager to use NDK backend

- Update HintManager and its aidl types to use NDK backend
- Switch HintManager to using PowerHAL's WorkDuration
- Update SDK WorkDuration.java to no longer be parcelable,
    since it isn't being sent over binders anymore.
- Remove duplicate WorkDuration in powermanager in favor of PowerHAL's

Bug: 315894228
Test: atest HintManagerServiceTest
Test: atest PerformanceHintNativeTestCases
Test: atest PerformanceHintManagerTest
Change-Id: I03494b76a5a3c0132c672de5406a6b190fbffcd4
parent f5d03c19
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -20,7 +20,6 @@ cc_library_shared {
        "PowerHintSessionWrapper.cpp",
        "PowerSaveState.cpp",
        "Temperature.cpp",
        "WorkDuration.cpp",
        "WorkSource.cpp",
        ":libpowermanager_aidl",
    ],
@@ -52,6 +51,10 @@ cc_library_shared {
        "android.hardware.power@1.3",
    ],

    whole_static_libs: [
        "android.os.hintmanager_aidl-ndk",
    ],

    cflags: [
        "-Wall",
        "-Werror",
+0 −52
Original line number Diff line number Diff line
/**
 * Copyright (C) 2023 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 LOG_TAG "WorkDuration"

#include <android/WorkDuration.h>
#include <android/performance_hint.h>
#include <binder/Parcel.h>
#include <utils/Log.h>

namespace android::os {

WorkDuration::WorkDuration(int64_t startTimestampNanos, int64_t totalDurationNanos,
                           int64_t cpuDurationNanos, int64_t gpuDurationNanos)
      : timestampNanos(0),
        actualTotalDurationNanos(totalDurationNanos),
        workPeriodStartTimestampNanos(startTimestampNanos),
        actualCpuDurationNanos(cpuDurationNanos),
        actualGpuDurationNanos(gpuDurationNanos) {}

status_t WorkDuration::writeToParcel(Parcel* parcel) const {
    if (parcel == nullptr) {
        ALOGE("%s: Null parcel", __func__);
        return BAD_VALUE;
    }

    parcel->writeInt64(workPeriodStartTimestampNanos);
    parcel->writeInt64(actualTotalDurationNanos);
    parcel->writeInt64(actualCpuDurationNanos);
    parcel->writeInt64(actualGpuDurationNanos);
    parcel->writeInt64(timestampNanos);
    return OK;
}

status_t WorkDuration::readFromParcel(const Parcel*) {
    return INVALID_OPERATION;
}

} // namespace android::os
+0 −71
Original line number Diff line number Diff line
/**
 * Copyright (C) 2023 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 <binder/Parcelable.h>
#include <math.h>

struct AWorkDuration {};

namespace android::os {

/**
 * C++ Parcelable version of {@link PerformanceHintManager.WorkDuration} that can be used in
 * binder calls.
 * This file needs to be kept in sync with the WorkDuration in
 * frameworks/base/core/java/android/os/WorkDuration.java
 */
struct WorkDuration : AWorkDuration, android::Parcelable {
    WorkDuration() = default;
    ~WorkDuration() = default;

    WorkDuration(int64_t workPeriodStartTimestampNanos, int64_t actualTotalDurationNanos,
                 int64_t actualCpuDurationNanos, int64_t actualGpuDurationNanos);
    status_t writeToParcel(Parcel* parcel) const override;
    status_t readFromParcel(const Parcel* parcel) override;

    inline bool equalsWithoutTimestamp(const WorkDuration& other) const {
        return workPeriodStartTimestampNanos == other.workPeriodStartTimestampNanos &&
                actualTotalDurationNanos == other.actualTotalDurationNanos &&
                actualCpuDurationNanos == other.actualCpuDurationNanos &&
                actualGpuDurationNanos == other.actualGpuDurationNanos;
    }

    bool operator==(const WorkDuration& other) const {
        return timestampNanos == other.timestampNanos && equalsWithoutTimestamp(other);
    }

    bool operator!=(const WorkDuration& other) const { return !(*this == other); }

    friend std::ostream& operator<<(std::ostream& os, const WorkDuration& workDuration) {
        os << "{"
           << "workPeriodStartTimestampNanos: " << workDuration.workPeriodStartTimestampNanos
           << ", actualTotalDurationNanos: " << workDuration.actualTotalDurationNanos
           << ", actualCpuDurationNanos: " << workDuration.actualCpuDurationNanos
           << ", actualGpuDurationNanos: " << workDuration.actualGpuDurationNanos
           << ", timestampNanos: " << workDuration.timestampNanos << "}";
        return os;
    }

    int64_t timestampNanos;
    int64_t actualTotalDurationNanos;
    int64_t workPeriodStartTimestampNanos;
    int64_t actualCpuDurationNanos;
    int64_t actualGpuDurationNanos;
};

} // namespace android::os