Merge "Merge tag 'AU_LINUX_ANDROID_KK.04.04.04.010.094' into HEAD"
This commit is contained in:
commit
b236da9f2f
3 changed files with 27 additions and 8 deletions
|
@ -316,8 +316,9 @@ enum loc_api_adapter_err {
|
|||
LOC_API_ADAPTER_ERR_TIMEOUT = 8,
|
||||
LOC_API_ADAPTER_ERR_SERVICE_NOT_PRESENT = 9,
|
||||
|
||||
LOC_API_ADAPTER_ERR_ENGINE_DOWN = 100,
|
||||
LOC_API_ADAPTER_ERR_FAILURE,
|
||||
/* equating engine down to phone offline, as they are the same errror */
|
||||
LOC_API_ADAPTER_ERR_ENGINE_DOWN = LOC_API_ADAPTER_ERR_PHONE_OFFLINE,
|
||||
LOC_API_ADAPTER_ERR_FAILURE = 101,
|
||||
LOC_API_ADAPTER_ERR_UNKNOWN
|
||||
};
|
||||
|
||||
|
|
|
@ -1718,7 +1718,9 @@ static int loc_eng_start_handler(loc_eng_data_s_type &loc_eng_data)
|
|||
ret_val = loc_eng_data.adapter->startFix();
|
||||
|
||||
if (ret_val == LOC_API_ADAPTER_ERR_SUCCESS ||
|
||||
ret_val == LOC_API_ADAPTER_ERR_ENGINE_DOWN)
|
||||
ret_val == LOC_API_ADAPTER_ERR_ENGINE_DOWN ||
|
||||
ret_val == LOC_API_ADAPTER_ERR_PHONE_OFFLINE ||
|
||||
ret_val == LOC_API_ADAPTER_ERR_GENERAL_FAILURE)
|
||||
{
|
||||
loc_eng_data.adapter->setInSession(TRUE);
|
||||
loc_inform_gps_status(loc_eng_data, GPS_STATUS_SESSION_BEGIN);
|
||||
|
|
|
@ -101,12 +101,28 @@ static void *timer_thread(void *thread_data)
|
|||
break;
|
||||
}
|
||||
|
||||
pthread_mutex_destroy(&t->timer_mutex);
|
||||
pthread_cond_destroy(&t->timer_cond);
|
||||
|
||||
if(ETIMEDOUT == ret)
|
||||
t->callback_func(t->user_data, ret);
|
||||
|
||||
// A (should be rare) race condition is that, when the loc_time_stop is called
|
||||
// and acquired mutex, we reach here. pthread_mutex_destroy will fail with
|
||||
// error code EBUSY. We give it 6 tries in 5 seconds. Should be eanough time
|
||||
// for loc_timer_stop to complete. With the 7th try, we also perform unlock
|
||||
// prior to destroy.
|
||||
{
|
||||
int i;
|
||||
for (i = 0; EBUSY == pthread_mutex_destroy(&t->timer_mutex) && i <= 5; i++) {
|
||||
if (i < 5) {
|
||||
sleep(1);
|
||||
} else {
|
||||
// nah, forget it, something is seriously wrong. Mutex has been
|
||||
// held too long. Unlock the mutext here.
|
||||
pthread_mutex_unlock(&t->timer_mutex);
|
||||
}
|
||||
}
|
||||
}
|
||||
pthread_cond_destroy(&t->timer_cond);
|
||||
|
||||
free(t);
|
||||
LOC_LOGD("%s:%d]: Exit\n", __func__, __LINE__);
|
||||
return NULL;
|
||||
|
@ -175,8 +191,8 @@ _err:
|
|||
void loc_timer_stop(void* handle) {
|
||||
timer_data* t = (timer_data*)handle;
|
||||
|
||||
if (NULL != t && (READY == t->state || WAITING == t->state)) {
|
||||
pthread_mutex_lock(&(t->timer_mutex));
|
||||
if (NULL != t && (READY == t->state || WAITING == t->state) &&
|
||||
pthread_mutex_lock(&(t->timer_mutex)) == 0) {
|
||||
if (READY == t->state || WAITING == t->state) {
|
||||
pthread_cond_signal(&t->timer_cond);
|
||||
t->state = ABORT;
|
||||
|
|
Loading…
Reference in a new issue