Merge "Migrate suspend HAL interactions to new suspend control AIDL."

This commit is contained in:
Santos Cordon
2019-02-05 18:03:55 +00:00
committed by Gerrit Code Review
3 changed files with 47 additions and 24 deletions

View File

@@ -120,6 +120,7 @@ cc_defaults {
"android.frameworks.schedulerservice@1.0", "android.frameworks.schedulerservice@1.0",
"android.frameworks.sensorservice@1.0", "android.frameworks.sensorservice@1.0",
"android.system.suspend@1.0", "android.system.suspend@1.0",
"suspend_control_aidl_interface-cpp",
], ],
static_libs: [ static_libs: [

View File

@@ -30,8 +30,8 @@
#include <android/hardware/power/1.0/IPower.h> #include <android/hardware/power/1.0/IPower.h>
#include <android/hardware/power/1.1/IPower.h> #include <android/hardware/power/1.1/IPower.h>
#include <android/system/suspend/1.0/ISystemSuspend.h> #include <android/system/suspend/BnSuspendCallback.h>
#include <android/system/suspend/1.0/ISystemSuspendCallback.h> #include <android/system/suspend/ISuspendControlService.h>
#include <android_runtime/AndroidRuntime.h> #include <android_runtime/AndroidRuntime.h>
#include <jni.h> #include <jni.h>
@@ -44,14 +44,14 @@
using android::hardware::Return; using android::hardware::Return;
using android::hardware::Void; using android::hardware::Void;
using android::system::suspend::BnSuspendCallback;
using android::hardware::power::V1_0::PowerStatePlatformSleepState; using android::hardware::power::V1_0::PowerStatePlatformSleepState;
using android::hardware::power::V1_0::PowerStateVoter; using android::hardware::power::V1_0::PowerStateVoter;
using android::hardware::power::V1_0::Status; using android::hardware::power::V1_0::Status;
using android::hardware::power::V1_1::PowerStateSubsystem; using android::hardware::power::V1_1::PowerStateSubsystem;
using android::hardware::power::V1_1::PowerStateSubsystemSleepState; using android::hardware::power::V1_1::PowerStateSubsystemSleepState;
using android::hardware::hidl_vec; using android::hardware::hidl_vec;
using android::system::suspend::V1_0::ISystemSuspend; using android::system::suspend::ISuspendControlService;
using android::system::suspend::V1_0::ISystemSuspendCallback;
using IPowerV1_1 = android::hardware::power::V1_1::IPower; using IPowerV1_1 = android::hardware::power::V1_1::IPower;
using IPowerV1_0 = android::hardware::power::V1_0::IPower; using IPowerV1_0 = android::hardware::power::V1_0::IPower;
@@ -66,7 +66,7 @@ static sem_t wakeup_sem;
extern sp<IPowerV1_0> getPowerHalV1_0(); extern sp<IPowerV1_0> getPowerHalV1_0();
extern sp<IPowerV1_1> getPowerHalV1_1(); extern sp<IPowerV1_1> getPowerHalV1_1();
extern bool processPowerHalReturn(const Return<void> &ret, const char* functionName); extern bool processPowerHalReturn(const Return<void> &ret, const char* functionName);
extern sp<ISystemSuspend> getSuspendHal(); extern sp<ISuspendControlService> getSuspendControl();
// Java methods used in getLowPowerStats // Java methods used in getLowPowerStats
static jmethodID jgetAndUpdatePlatformState = NULL; static jmethodID jgetAndUpdatePlatformState = NULL;
@@ -74,17 +74,17 @@ static jmethodID jgetSubsystem = NULL;
static jmethodID jputVoter = NULL; static jmethodID jputVoter = NULL;
static jmethodID jputState = NULL; static jmethodID jputState = NULL;
class WakeupCallback : public ISystemSuspendCallback { class WakeupCallback : public BnSuspendCallback {
public: public:
Return<void> notifyWakeup(bool success) override { binder::Status notifyWakeup(bool success) override {
ALOGV("In wakeup_callback: %s", success ? "resumed from suspend" : "suspend aborted"); ALOGI("In wakeup_callback: %s", success ? "resumed from suspend" : "suspend aborted");
int ret = sem_post(&wakeup_sem); int ret = sem_post(&wakeup_sem);
if (ret < 0) { if (ret < 0) {
char buf[80]; char buf[80];
strerror_r(errno, buf, sizeof(buf)); strerror_r(errno, buf, sizeof(buf));
ALOGE("Error posting wakeup sem: %s\n", buf); ALOGE("Error posting wakeup sem: %s\n", buf);
} }
return Void(); return binder::Status::ok();
} }
}; };
@@ -107,9 +107,12 @@ static jint nativeWaitWakeup(JNIEnv *env, jobject clazz, jobject outBuf)
jniThrowException(env, "java/lang/IllegalStateException", buf); jniThrowException(env, "java/lang/IllegalStateException", buf);
return -1; return -1;
} }
ALOGV("Registering callback..."); sp<ISuspendControlService> suspendControl = getSuspendControl();
sp<ISystemSuspend> suspendHal = getSuspendHal(); bool isRegistered = false;
suspendHal->registerCallback(new WakeupCallback()); suspendControl->registerCallback(new WakeupCallback(), &isRegistered);
if (!isRegistered) {
ALOGE("Failed to register wakeup callback");
}
} }
// Wait for wakeup. // Wait for wakeup.

View File

@@ -20,6 +20,7 @@
#include <android/hardware/power/1.1/IPower.h> #include <android/hardware/power/1.1/IPower.h>
#include <android/system/suspend/1.0/ISystemSuspend.h> #include <android/system/suspend/1.0/ISystemSuspend.h>
#include <android/system/suspend/ISuspendControlService.h>
#include <nativehelper/JNIHelp.h> #include <nativehelper/JNIHelp.h>
#include "jni.h" #include "jni.h"
@@ -30,13 +31,14 @@
#include <android-base/chrono_utils.h> #include <android-base/chrono_utils.h>
#include <android_runtime/AndroidRuntime.h> #include <android_runtime/AndroidRuntime.h>
#include <android_runtime/Log.h> #include <android_runtime/Log.h>
#include <binder/IServiceManager.h>
#include <hardware/power.h>
#include <hardware_legacy/power.h>
#include <hidl/ServiceManagement.h>
#include <utils/Timers.h> #include <utils/Timers.h>
#include <utils/misc.h> #include <utils/misc.h>
#include <utils/String8.h> #include <utils/String8.h>
#include <utils/Log.h> #include <utils/Log.h>
#include <hardware/power.h>
#include <hardware_legacy/power.h>
#include <hidl/ServiceManagement.h>
#include "com_android_server_power_PowerManagerService.h" #include "com_android_server_power_PowerManagerService.h"
@@ -48,6 +50,7 @@ using android::String8;
using android::system::suspend::V1_0::ISystemSuspend; using android::system::suspend::V1_0::ISystemSuspend;
using android::system::suspend::V1_0::IWakeLock; using android::system::suspend::V1_0::IWakeLock;
using android::system::suspend::V1_0::WakeLockType; using android::system::suspend::V1_0::WakeLockType;
using android::system::suspend::ISuspendControlService;
using IPowerV1_1 = android::hardware::power::V1_1::IPower; using IPowerV1_1 = android::hardware::power::V1_1::IPower;
using IPowerV1_0 = android::hardware::power::V1_0::IPower; using IPowerV1_0 = android::hardware::power::V1_0::IPower;
@@ -176,6 +179,7 @@ void android_server_PowerManagerService_userActivity(nsecs_t eventTime, int32_t
} }
static sp<ISystemSuspend> gSuspendHal = nullptr; static sp<ISystemSuspend> gSuspendHal = nullptr;
static sp<ISuspendControlService> gSuspendControl = nullptr;
static sp<IWakeLock> gSuspendBlocker = nullptr; static sp<IWakeLock> gSuspendBlocker = nullptr;
static std::mutex gSuspendMutex; static std::mutex gSuspendMutex;
@@ -191,18 +195,33 @@ sp<ISystemSuspend> getSuspendHal() {
return gSuspendHal; return gSuspendHal;
} }
sp<ISuspendControlService> getSuspendControl() {
static std::once_flag suspendControlFlag;
std::call_once(suspendControlFlag, [](){
while(gSuspendControl == nullptr) {
sp<IBinder> control =
defaultServiceManager()->getService(String16("suspend_control"));
if (control != nullptr) {
gSuspendControl = interface_cast<ISuspendControlService>(control);
}
}
});
return gSuspendControl;
}
void enableAutoSuspend() { void enableAutoSuspend() {
static bool enabled = false; static bool enabled = false;
std::lock_guard<std::mutex> lock(gSuspendMutex);
if (!enabled) { if (!enabled) {
sp<ISystemSuspend> suspendHal = getSuspendHal(); sp<ISuspendControlService> suspendControl = getSuspendControl();
suspendHal->enableAutosuspend(); suspendControl->enableAutosuspend(&enabled);
enabled = true;
} }
if (gSuspendBlocker) {
gSuspendBlocker->release(); {
gSuspendBlocker.clear(); std::lock_guard<std::mutex> lock(gSuspendMutex);
if (gSuspendBlocker) {
gSuspendBlocker->release();
gSuspendBlocker.clear();
}
} }
} }