diff options
author | Roman Birg <roman@cyngn.com> | 2016-06-09 14:49:42 -0700 |
---|---|---|
committer | Roman Birg <roman@cyngn.com> | 2016-06-09 14:49:55 -0700 |
commit | 9792f9638a9d3f7dc84cb80182fa188d639d4ae5 (patch) | |
tree | 235eafeb18b71d72951530ad1fe3826f6346e205 | |
parent | ef133b18578fd82dfd7abfb961acb783dfae2854 (diff) | |
download | android_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.cpp | 81 |
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) { |