diff options
author | Jaikumar Ganesh <jaikumar@google.com> | 2010-03-31 23:22:51 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2010-03-31 23:22:51 -0700 |
commit | d4afde3d12dd0320b64d3bf26bf805aafa09395c (patch) | |
tree | ea03bc5edbe7110ca087c5ffa43cd3614f5e8c5b /core/jni | |
parent | 1b3cd79674d9eddd0722828e18592752526c8089 (diff) | |
parent | b8fc825dfafd8792a4d9daead9d3d1b4a4b55de5 (diff) | |
download | frameworks_base-d4afde3d12dd0320b64d3bf26bf805aafa09395c.zip frameworks_base-d4afde3d12dd0320b64d3bf26bf805aafa09395c.tar.gz frameworks_base-d4afde3d12dd0320b64d3bf26bf805aafa09395c.tar.bz2 |
am b8fc825d: am 3a0d1d11: Merge "Fix crash while turning bluetooth on, due to a race condition." into froyo
Merge commit 'b8fc825dfafd8792a4d9daead9d3d1b4a4b55de5' into kraken
* commit 'b8fc825dfafd8792a4d9daead9d3d1b4a4b55de5':
Fix crash while turning bluetooth on, due to a race condition.
Diffstat (limited to 'core/jni')
-rw-r--r-- | core/jni/android_bluetooth_common.h | 2 | ||||
-rw-r--r-- | core/jni/android_server_BluetoothEventLoop.cpp | 9 |
2 files changed, 9 insertions, 2 deletions
diff --git a/core/jni/android_bluetooth_common.h b/core/jni/android_bluetooth_common.h index ef9b66b..378bb6f 100644 --- a/core/jni/android_bluetooth_common.h +++ b/core/jni/android_bluetooth_common.h @@ -88,6 +88,8 @@ struct event_loop_native_data_t { int envVer; /* reference to our java self */ jobject me; + /* flag to indicate if the event loop thread is running */ + bool running; }; struct _Properties { diff --git a/core/jni/android_server_BluetoothEventLoop.cpp b/core/jni/android_server_BluetoothEventLoop.cpp index 0e7fd66..259cc01 100644 --- a/core/jni/android_server_BluetoothEventLoop.cpp +++ b/core/jni/android_server_BluetoothEventLoop.cpp @@ -548,6 +548,8 @@ static void *eventLoopMain(void *ptr) { dbus_connection_set_watch_functions(nat->conn, dbusAddWatch, dbusRemoveWatch, dbusToggleWatch, ptr, NULL); + nat->running = true; + while (1) { for (int i = 0; i < nat->pollMemberCount; i++) { if (!nat->pollData[i].revents) { @@ -591,7 +593,7 @@ static void *eventLoopMain(void *ptr) { break; } } - while (dbus_connection_dispatch(nat->conn) == + while (dbus_connection_dispatch(nat->conn) == DBUS_DISPATCH_DATA_REMAINS) { } @@ -607,6 +609,8 @@ static jboolean startEventLoopNative(JNIEnv *env, jobject object) { pthread_mutex_lock(&(nat->thread_mutex)); + nat->running = false; + if (nat->pollData) { LOGW("trying to start EventLoop a second time!"); pthread_mutex_unlock( &(nat->thread_mutex) ); @@ -703,6 +707,7 @@ static void stopEventLoopNative(JNIEnv *env, jobject object) { nat->controlFdW = 0; close(fd); } + nat->running = false; pthread_mutex_unlock(&(nat->thread_mutex)); #endif // HAVE_BLUETOOTH } @@ -713,7 +718,7 @@ static jboolean isEventLoopRunningNative(JNIEnv *env, jobject object) { native_data_t *nat = get_native_data(env, object); pthread_mutex_lock(&(nat->thread_mutex)); - if (nat->pollData) { + if (nat->running) { result = JNI_TRUE; } pthread_mutex_unlock(&(nat->thread_mutex)); |