From 1693aa923d95705ff77a0cff611c25b4fcc831a2 Mon Sep 17 00:00:00 2001 From: Jaehong Jo Date: Fri, 31 Jul 2015 15:10:49 +0900 Subject: [PATCH] Fixed Android EDR Crash issue. Prevent global variable memory leak. Change-Id: I08b75fcfb4a4ed5554e96e9d1a8772f072e7b8b8 Signed-off-by: Jaehong Jo Reviewed-on: https://gerrit.iotivity.org/gerrit/2017 Tested-by: jenkins-iotivity Reviewed-by: Jon A. Cruz --- .../src/bt_edr_adapter/android/caedrserver.c | 29 ++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/resource/csdk/connectivity/src/bt_edr_adapter/android/caedrserver.c b/resource/csdk/connectivity/src/bt_edr_adapter/android/caedrserver.c index 412cea4..72e1522 100644 --- a/resource/csdk/connectivity/src/bt_edr_adapter/android/caedrserver.c +++ b/resource/csdk/connectivity/src/bt_edr_adapter/android/caedrserver.c @@ -106,6 +106,11 @@ static ca_mutex g_mutexStateList = NULL; */ static ca_mutex g_mutexObjectList = NULL; +/** + * Mutex to synchronize input stream. + */ +static ca_mutex g_mutexInputStream = NULL; + typedef struct send_data { char* address; @@ -396,6 +401,12 @@ static void CAEDRServerDestroyMutex() g_mutexObjectList = NULL; } + if (g_mutexInputStream) + { + ca_mutex_free(g_mutexInputStream); + g_mutexInputStream = NULL; + } + OIC_LOG(DEBUG, TAG, "OUT"); } @@ -467,6 +478,15 @@ static CAResult_t CAEDRServerCreateMutex() return CA_STATUS_FAILED; } + g_mutexInputStream = ca_mutex_new(); + if (!g_mutexInputStream) + { + OIC_LOG(ERROR, TAG, "Failed to created g_mutexInputStream."); + + CAEDRServerDestroyMutex(); + return CA_STATUS_FAILED; + } + OIC_LOG(DEBUG, TAG, "OUT"); return CA_STATUS_OK; } @@ -760,8 +780,6 @@ CAResult_t CAEDRNativeReadData(JNIEnv *env, uint32_t id, CAAdapterServerType_t t jni_mid_getInputStream); OIC_LOG(DEBUG, TAG, "[EDR][Native] btReadData: ready inputStream.."); - g_inputStream = (*env)->NewGlobalRef(env, jni_obj_inputStream); - jclass jni_cid_InputStream = (*env)->FindClass(env, "java/io/InputStream"); if (!jni_cid_InputStream) { @@ -778,8 +796,15 @@ CAResult_t CAEDRNativeReadData(JNIEnv *env, uint32_t id, CAAdapterServerType_t t return CA_STATUS_FAILED; } + ca_mutex_lock(g_mutexInputStream); + if (!g_inputStream) + { + g_inputStream = (*env)->NewGlobalRef(env, jni_obj_inputStream); + } + jint length = (*env)->CallIntMethod(env, g_inputStream, jni_mid_read, jbuf, (jint) 0, MAX_PDU_BUFFER); + ca_mutex_unlock(g_mutexInputStream); OIC_LOG(DEBUG, TAG, "[EDR][Native] read something from InputStream"); -- 2.7.4