Merge changes I38c8ec64,Iac544226
* changes:
Make sure wakelock is held before releaseing it
Do not delete/re-create wakelock on acquisition/release
diff --git a/jni/com_android_bluetooth_btservice_AdapterService.cpp b/jni/com_android_bluetooth_btservice_AdapterService.cpp
index 9239aad..85fb642 100755
--- a/jni/com_android_bluetooth_btservice_AdapterService.cpp
+++ b/jni/com_android_bluetooth_btservice_AdapterService.cpp
@@ -488,7 +488,7 @@
static JavaVMAttachArgs sAttachArgs = {
.version = JNI_VERSION_1_6,
- .name = "bluedroid wake/alarm thread",
+ .name = "bluetooth wake",
.group = NULL
};
@@ -532,54 +532,62 @@
jint status = vm->GetEnv((void **)&env, JNI_VERSION_1_6);
if (status != JNI_OK && status != JNI_EDETACHED) {
ALOGE("%s unable to get environment for JNI call", __func__);
- return BT_STATUS_FAIL;
+ return BT_STATUS_JNI_ENVIRONMENT_ERROR;
}
if (status == JNI_EDETACHED && vm->AttachCurrentThread(&env, &sAttachArgs) != 0) {
ALOGE("%s unable to attach thread to VM", __func__);
- return BT_STATUS_FAIL;
+ return BT_STATUS_JNI_THREAD_ATTACH_ERROR;
}
- jboolean ret = JNI_FALSE;
+ jint ret = BT_STATUS_SUCCESS;
jstring lock_name_jni = env->NewStringUTF(lock_name);
if (lock_name_jni) {
- ret = env->CallBooleanMethod(sJniAdapterServiceObj, method_acquireWakeLock, lock_name_jni);
+ bool acquired = env->CallBooleanMethod(sJniAdapterServiceObj,
+ method_acquireWakeLock, lock_name_jni);
+ if (!acquired) ret = BT_STATUS_WAKELOCK_ERROR;
env->DeleteLocalRef(lock_name_jni);
} else {
ALOGE("%s unable to allocate string: %s", __func__, lock_name);
+ ret = BT_STATUS_NOMEM;
}
if (status == JNI_EDETACHED) {
vm->DetachCurrentThread();
}
- return ret ? BT_STATUS_SUCCESS : BT_STATUS_FAIL;
+ return ret;
}
static int release_wake_lock_callout(const char *lock_name) {
JNIEnv *env;
JavaVM *vm = AndroidRuntime::getJavaVM();
jint status = vm->GetEnv((void **)&env, JNI_VERSION_1_6);
-
if (status != JNI_OK && status != JNI_EDETACHED) {
ALOGE("%s unable to get environment for JNI call", __func__);
- return BT_STATUS_FAIL;
+ return BT_STATUS_JNI_ENVIRONMENT_ERROR;
}
if (status == JNI_EDETACHED && vm->AttachCurrentThread(&env, &sAttachArgs) != 0) {
ALOGE("%s unable to attach thread to VM", __func__);
- return BT_STATUS_FAIL;
+ return BT_STATUS_JNI_THREAD_ATTACH_ERROR;
}
- jboolean ret = JNI_FALSE;
+
+ jint ret = BT_STATUS_SUCCESS;
jstring lock_name_jni = env->NewStringUTF(lock_name);
if (lock_name_jni) {
- ret = env->CallBooleanMethod(sJniAdapterServiceObj, method_releaseWakeLock, lock_name_jni);
+ bool released = env->CallBooleanMethod(sJniAdapterServiceObj,
+ method_releaseWakeLock, lock_name_jni);
+ if (!released) ret = BT_STATUS_WAKELOCK_ERROR;
env->DeleteLocalRef(lock_name_jni);
} else {
ALOGE("%s unable to allocate string: %s", __func__, lock_name);
+ ret = BT_STATUS_NOMEM;
}
+
if (status == JNI_EDETACHED) {
vm->DetachCurrentThread();
}
- return ret ? BT_STATUS_SUCCESS : BT_STATUS_FAIL;
+
+ return ret;
}
// Called by Java code when alarm is fired. A wake lock is held by the caller
diff --git a/src/com/android/bluetooth/btservice/AdapterService.java b/src/com/android/bluetooth/btservice/AdapterService.java
index 5ca9d24..a4d76b7 100644
--- a/src/com/android/bluetooth/btservice/AdapterService.java
+++ b/src/com/android/bluetooth/btservice/AdapterService.java
@@ -547,7 +547,8 @@
// {@link #releaseWakeLock(String lockName)}, so a synchronization is needed here.
synchronized (this) {
if (mWakeLock != null) {
- mWakeLock.release();
+ if (mWakeLock.isHeld())
+ mWakeLock.release();
mWakeLock = null;
}
}
@@ -2020,21 +2021,15 @@
// extended to allow acquiring an arbitrary number of wake locks. The current interface
// takes |lockName| as a parameter in anticipation of that implementation.
private boolean acquireWakeLock(String lockName) {
- if (mWakeLock != null) {
- if (!lockName.equals(mWakeLockName)) {
- errorLog("Multiple wake lock acquisition attempted; aborting: " + lockName);
- return false;
+ synchronized (this) {
+ if (mWakeLock == null) {
+ mWakeLockName = lockName;
+ mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, lockName);
}
- // We're already holding the desired wake lock so return success.
- if (mWakeLock.isHeld()) {
- return true;
- }
+ if (!mWakeLock.isHeld())
+ mWakeLock.acquire();
}
-
- mWakeLockName = lockName;
- mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, lockName);
- mWakeLock.acquire();
return true;
}
@@ -2049,9 +2044,8 @@
return false;
}
- mWakeLock.release();
- mWakeLock = null;
- mWakeLockName = null;
+ if (mWakeLock.isHeld())
+ mWakeLock.release();
}
return true;
}