summaryrefslogtreecommitdiffstats
path: root/core/jni
diff options
context:
space:
mode:
authorJaikumar Ganesh <jaikumar@google.com>2010-03-31 23:22:51 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2010-03-31 23:22:51 -0700
commitd4afde3d12dd0320b64d3bf26bf805aafa09395c (patch)
treeea03bc5edbe7110ca087c5ffa43cd3614f5e8c5b /core/jni
parent1b3cd79674d9eddd0722828e18592752526c8089 (diff)
parentb8fc825dfafd8792a4d9daead9d3d1b4a4b55de5 (diff)
downloadframeworks_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.h2
-rw-r--r--core/jni/android_server_BluetoothEventLoop.cpp9
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));