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;
     }