summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoman Birg <roman@cyngn.com>2016-06-09 14:49:42 -0700
committerRoman Birg <roman@cyngn.com>2016-06-09 14:49:55 -0700
commit9792f9638a9d3f7dc84cb80182fa188d639d4ae5 (patch)
tree235eafeb18b71d72951530ad1fe3826f6346e205
parentef133b18578fd82dfd7abfb961acb783dfae2854 (diff)
downloadandroid_packages_apps_Bluetooth-9792f9638a9d3f7dc84cb80182fa188d639d4ae5.tar.gz
android_packages_apps_Bluetooth-9792f9638a9d3f7dc84cb80182fa188d639d4ae5.tar.bz2
android_packages_apps_Bluetooth-9792f9638a9d3f7dc84cb80182fa188d639d4ae5.zip
Revert "Ensure synchronized access of JNI callback object"
This was supposed to fix screen-on buffer underruns with angler, but it did not solve the issueso I'd rather revert this now than it causing issues down the line. This reverts commit 2c9c5455f29312e4180181a72e145dd9e656e7c6. Change-Id: I2bc62df648f75cc6ba8e64db04cdc378ecc6f23d
-rw-r--r--jni/com_android_bluetooth_a2dp.cpp81
1 files changed, 28 insertions, 53 deletions
diff --git a/jni/com_android_bluetooth_a2dp.cpp b/jni/com_android_bluetooth_a2dp.cpp
index 565cd99a9..df8fe9837 100644
--- a/jni/com_android_bluetooth_a2dp.cpp
+++ b/jni/com_android_bluetooth_a2dp.cpp
@@ -27,7 +27,6 @@
#include "android_runtime/AndroidRuntime.h"
#include <string.h>
-#include <pthread.h>
namespace android {
static jmethodID method_onConnectionStateChanged;
@@ -40,8 +39,6 @@ static const btav_interface_t *sBluetoothA2dpInterface = NULL;
static jobject mCallbacksObj = NULL;
static JNIEnv *sCallbackEnv = NULL;
-static pthread_mutex_t mMutex = PTHREAD_MUTEX_INITIALIZER;
-
static bool checkCallbackThread() {
// Always fetch the latest callbackEnv from AdapterService.
// Caching this could cause this sCallbackEnv to go out-of-sync
@@ -61,6 +58,10 @@ static void bta2dp_connection_state_callback(btav_connection_state_t state, bt_b
ALOGI("%s", __FUNCTION__);
+ if (mCallbacksObj == NULL) {
+ ALOGE("Callbacks Obj is no more valid: '%s", __FUNCTION__);
+ return;
+ }
if (!checkCallbackThread()) { \
ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__); \
return; \
@@ -74,16 +75,8 @@ static void bta2dp_connection_state_callback(btav_connection_state_t state, bt_b
}
sCallbackEnv->SetByteArrayRegion(addr, 0, sizeof(bt_bdaddr_t), (jbyte*) bd_addr);
-
- pthread_mutex_lock(&mMutex);
- if (mCallbacksObj != NULL) {
- sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onConnectionStateChanged,
- (jint) state, addr);
- } else {
- ALOGE("Callbacks Obj is no more valid: '%s", __FUNCTION__);
- }
- pthread_mutex_unlock(&mMutex);
-
+ sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onConnectionStateChanged, (jint) state,
+ addr);
checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
sCallbackEnv->DeleteLocalRef(addr);
}
@@ -93,6 +86,10 @@ static void bta2dp_audio_state_callback(btav_audio_state_t state, bt_bdaddr_t* b
ALOGI("%s", __FUNCTION__);
+ if (mCallbacksObj == NULL) {
+ ALOGE("Callbacks Obj is no more valid: '%s", __FUNCTION__);
+ return;
+ }
if (!checkCallbackThread()) { \
ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__); \
return; \
@@ -105,16 +102,8 @@ static void bta2dp_audio_state_callback(btav_audio_state_t state, bt_bdaddr_t* b
}
sCallbackEnv->SetByteArrayRegion(addr, 0, sizeof(bt_bdaddr_t), (jbyte*) bd_addr);
-
- pthread_mutex_lock(&mMutex);
- if (mCallbacksObj != NULL) {
- sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onAudioStateChanged,
- (jint) state, addr);
- } else {
- ALOGE("Callbacks Obj is no more valid: '%s", __FUNCTION__);
- }
- pthread_mutex_unlock(&mMutex);
-
+ sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onAudioStateChanged, (jint) state,
+ addr);
checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
sCallbackEnv->DeleteLocalRef(addr);
}
@@ -124,6 +113,10 @@ static void bta2dp_connection_priority_callback(bt_bdaddr_t* bd_addr) {
ALOGI("%s", __FUNCTION__);
+ if (mCallbacksObj == NULL) {
+ ALOGE("Callbacks Obj is no more valid: '%s", __FUNCTION__);
+ return;
+ }
if (!checkCallbackThread()) { \
ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__); \
return; \
@@ -136,16 +129,7 @@ static void bta2dp_connection_priority_callback(bt_bdaddr_t* bd_addr) {
}
sCallbackEnv->SetByteArrayRegion(addr, 0, sizeof(bt_bdaddr_t), (jbyte*) bd_addr);
-
- pthread_mutex_lock(&mMutex);
- if (mCallbacksObj != NULL) {
- sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onCheckConnectionPriority,
- addr);
- } else {
- ALOGE("Callbacks Obj is no more valid: '%s", __FUNCTION__);
- }
- pthread_mutex_unlock(&mMutex);
-
+ sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onCheckConnectionPriority, addr);
checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
sCallbackEnv->DeleteLocalRef(addr);
}
@@ -154,20 +138,16 @@ static void bta2dp_multicast_enabled_callback(int state) {
ALOGI("%s", __FUNCTION__);
+ if (mCallbacksObj == NULL) {
+ ALOGE("Callbacks Obj is no more valid: '%s", __FUNCTION__);
+ return;
+ }
if (!checkCallbackThread()) { \
ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__); \
return; \
}
- pthread_mutex_lock(&mMutex);
- if (mCallbacksObj != NULL) {
- sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onMulticastStateChanged,
- state);
- } else {
- ALOGE("Callbacks Obj is no more valid: '%s", __FUNCTION__);
- }
- pthread_mutex_unlock(&mMutex);
-
+ sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onMulticastStateChanged, state);
checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
}
@@ -238,32 +218,29 @@ static void initNative(JNIEnv *env, jobject object, jint maxA2dpConnections,
sBluetoothA2dpInterface = NULL;
}
+ if (mCallbacksObj != NULL) {
+ ALOGW("Cleaning up A2DP callback object");
+ env->DeleteGlobalRef(mCallbacksObj);
+ mCallbacksObj = NULL;
+ }
+
if ( (sBluetoothA2dpInterface = (btav_interface_t *)
btInf->get_profile_interface(BT_PROFILE_ADVANCED_AUDIO_ID)) == NULL) {
ALOGE("Failed to get Bluetooth A2DP Interface");
return;
}
- pthread_mutex_lock(&mMutex);
- if (mCallbacksObj != NULL) {
- ALOGW("Cleaning up A2DP callback object");
- env->DeleteGlobalRef(mCallbacksObj);
- mCallbacksObj = NULL;
- }
mCallbacksObj = env->NewGlobalRef(object);
- pthread_mutex_unlock(&mMutex);
if ( (status = sBluetoothA2dpInterface->init(&sBluetoothA2dpCallbacks,
maxA2dpConnections, multiCastState)) != BT_STATUS_SUCCESS) {
ALOGE("Failed to initialize Bluetooth A2DP, status: %d", status);
sBluetoothA2dpInterface = NULL;
- pthread_mutex_lock(&mMutex);
if (mCallbacksObj != NULL) {
ALOGW("Clean up A2DP callback object");
env->DeleteGlobalRef(mCallbacksObj);
mCallbacksObj = NULL;
}
- pthread_mutex_unlock(&mMutex);
return;
}
@@ -283,12 +260,10 @@ static void cleanupNative(JNIEnv *env, jobject object) {
sBluetoothA2dpInterface = NULL;
}
- pthread_mutex_lock(&mMutex);
if (mCallbacksObj != NULL) {
env->DeleteGlobalRef(mCallbacksObj);
mCallbacksObj = NULL;
}
- pthread_mutex_unlock(&mMutex);
}
static jboolean connectA2dpNative(JNIEnv *env, jobject object, jbyteArray address) {