OSDN Git Service

jni: GpsLocationProvider: Check for pending callbacks before waiting
authorJared Suttles <jared.suttles@motorola.com>
Wed, 4 Nov 2009 22:53:44 +0000 (16:53 -0600)
committerMike Lockwood <lockwood@android.com>
Fri, 6 Nov 2009 13:28:58 +0000 (08:28 -0500)
This change fixes a corner case where a callback may not get handled until
a second callback arrives.  This can happen because there is a significant
section of the wait_for_event function where the mutex is not locked, and
the sPendingCallbacks member could be updated.  We now check to see if
there is a pending callback to handle before we wait for another callback.

Change-Id: I20cfae1e780944bb74133940dda032efc4c55540
Signed-off-by: Fred Fettinger <fred.fettinger@motorola.com>
Signed-off-by: Jared Suttles <jared.suttles@motorola.com>
Signed-off-by: Mike Lockwood <lockwood@android.com>
core/jni/android_location_GpsLocationProvider.cpp

index 4aed277..f845878 100755 (executable)
@@ -266,7 +266,9 @@ static void android_location_GpsLocationProvider_delete_aiding_data(JNIEnv* env,
 static void android_location_GpsLocationProvider_wait_for_event(JNIEnv* env, jobject obj)
 {
     pthread_mutex_lock(&sEventMutex);
-    pthread_cond_wait(&sEventCond, &sEventMutex);
+    while (sPendingCallbacks == 0) {
+        pthread_cond_wait(&sEventCond, &sEventMutex);
+    }
 
     // copy and clear the callback flags
     int pendingCallbacks = sPendingCallbacks;