153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia/* 253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * Copyright 2017 The Android Open Source Project 353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * 453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * Licensed under the Apache License, Version 2.0 (the "License"); 553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * you may not use this file except in compliance with the License. 653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * You may obtain a copy of the License at 753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * 853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * http://www.apache.org/licenses/LICENSE-2.0 953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * 1053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * Unless required by applicable law or agreed to in writing, software 1153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * distributed under the License is distributed on an "AS IS" BASIS, 1253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * See the License for the specific language governing permissions and 1453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * limitations under the License. 1553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia */ 1653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 1753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia//#define LOG_NDEBUG 0 1853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#define LOG_TAG "JWakeLock" 1953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <utils/Log.h> 2053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 2153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include "JWakeLock.h" 2253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 2353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <binder/IPCThreadState.h> 2453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <binder/IServiceManager.h> 2553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <media/stagefright/foundation/ADebug.h> 2653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <powermanager/PowerManager.h> 2753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 2853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 2953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jianamespace android { 3053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 3153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia//TODO: use JAVA PowerManager, instead of binder 3253692fa54d0bf1d69184035a4c05ea0601a09c14Wei JiaJWakeLock::JWakeLock() : 3353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mPowerManager(NULL), 3453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mWakeLockToken(NULL), 3553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mWakeLockCount(0), 3653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mDeathRecipient(new PMDeathRecipient(this)) {} 3753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 3853692fa54d0bf1d69184035a4c05ea0601a09c14Wei JiaJWakeLock::~JWakeLock() { 3953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (mPowerManager != NULL) { 4053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sp<IBinder> binder = IInterface::asBinder(mPowerManager); 4153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia binder->unlinkToDeath(mDeathRecipient); 4253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 4353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia clearPowerManager(); 4453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 4553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 4653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiabool JWakeLock::acquire() { 4753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (mWakeLockCount == 0) { 4853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia CHECK(mWakeLockToken == NULL); 4953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (mPowerManager == NULL) { 5053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // use checkService() to avoid blocking if power service is not up yet 5153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sp<IBinder> binder = 5253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia defaultServiceManager()->checkService(String16("power")); 5353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (binder == NULL) { 5453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ALOGW("could not get the power manager service"); 5553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } else { 5653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mPowerManager = interface_cast<IPowerManager>(binder); 5753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia binder->linkToDeath(mDeathRecipient); 5853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 5953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 6053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (mPowerManager != NULL) { 6153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sp<IBinder> binder = new BBinder(); 6253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int64_t token = IPCThreadState::self()->clearCallingIdentity(); 6353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia status_t status = mPowerManager->acquireWakeLock( 6453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia POWERMANAGER_PARTIAL_WAKE_LOCK, 6553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia binder, String16("JWakeLock"), String16("media")); 6653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia IPCThreadState::self()->restoreCallingIdentity(token); 6753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (status == NO_ERROR) { 6853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mWakeLockToken = binder; 6953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mWakeLockCount++; 7053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return true; 7153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 7253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 7353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } else { 7453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mWakeLockCount++; 7553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return true; 7653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 7753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return false; 7853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 7953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 8053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiavoid JWakeLock::release(bool force) { 8153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (mWakeLockCount == 0) { 8253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia return; 8353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 8453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (force) { 8553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia // Force wakelock release below by setting reference count to 1. 8653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mWakeLockCount = 1; 8753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 8853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (--mWakeLockCount == 0) { 8953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia CHECK(mWakeLockToken != NULL); 9053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (mPowerManager != NULL) { 9153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia int64_t token = IPCThreadState::self()->clearCallingIdentity(); 9253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mPowerManager->releaseWakeLock(mWakeLockToken, 0 /* flags */); 9353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia IPCThreadState::self()->restoreCallingIdentity(token); 9453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 9553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mWakeLockToken.clear(); 9653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 9753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 9853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 9953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiavoid JWakeLock::clearPowerManager() { 10053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia release(true); 10153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mPowerManager.clear(); 10253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 10353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 10453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiavoid JWakeLock::PMDeathRecipient::binderDied(const wp<IBinder>& who __unused) { 10553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia if (mWakeLock != NULL) { 10653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia mWakeLock->clearPowerManager(); 10753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia } 10853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} 10953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 11053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia} // namespace android 111