From cb119e6f520cbbd40e34a526226aa27dcdd8d0c8 Mon Sep 17 00:00:00 2001 From: Kevin Tang Date: Fri, 7 Jun 2013 13:39:24 -0700 Subject: [PATCH] Make Loc Init Asynchronous GPS-enable gets too heavy at powerup, when loc_init is synchronous, where loc goes to get the hardware handle if AP init happens faster than the GPS hardware. The loc init calling thread is from Android framework, and it locks a mutex that in turn could lock up system server main thread upon race conditions. The second half of loc init, i.e. the reinit, is now moved to loc worker thread. This should help release some of the powerup timing pressure on the framework threads. Added a message just for asynchrous Loc Init so as to execute init specifically. Change-Id: I369e461ca4ca61cea3a9729c84d24af4ffa8e51d CRs-fixed: 472843 --- .../libloc_api-rpc-glue/src/loc_api_rpc_glue.c | 18 +++++++++++++++--- loc_api/libloc_api_50001/loc_eng.cpp | 16 ++++++++-------- loc_api/libloc_api_50001/loc_eng_log.cpp | 3 ++- loc_api/libloc_api_50001/loc_eng_msg_id.h | 3 +++ 4 files changed, 28 insertions(+), 12 deletions(-) diff --git a/loc_api/libloc_api-rpc-50001/libloc_api-rpc-glue/src/loc_api_rpc_glue.c b/loc_api/libloc_api-rpc-50001/libloc_api-rpc-glue/src/loc_api_rpc_glue.c index 11c9e3d4..c047cb34 100644 --- a/loc_api/libloc_api-rpc-50001/libloc_api-rpc-glue/src/loc_api_rpc_glue.c +++ b/loc_api/libloc_api-rpc-50001/libloc_api-rpc-glue/src/loc_api_rpc_glue.c @@ -62,6 +62,9 @@ /* Logging Improvement */ #include "log_util.h" +/*Maximum number of Modem init*/ +#define RPC_TRY_NUM 10 + /* Uncomment to force ALOGD messages */ // #define ALOGD ALOGI @@ -308,6 +311,7 @@ rpc_loc_client_handle_type loc_open ( void* userData ) { + int try_num = RPC_TRY_NUM; ENTRY_LOG(); LOC_GLUE_CHECK_INIT(rpc_loc_client_handle_type); @@ -352,14 +356,22 @@ rpc_loc_client_handle_type loc_open ( enum clnt_stat stat = RPC_SUCCESS; EXIT_LOG_CALLFLOW(%s, "loc client open"); - stat = RPC_FUNC_VERSION(rpc_loc_open_, RPC_LOC_OPEN_VERSION)(&args, &rets, loc_api_clnt); + + /*try more for rpc_loc_open_xx()*/ + + do + { + stat = RPC_FUNC_VERSION(rpc_loc_open_, RPC_LOC_OPEN_VERSION)(&args, &rets, loc_api_clnt); + ret_val = (rpc_loc_client_handle_type) rets.loc_open_result; + try_num--; + + }while( (RPC_SUCCESS != stat||0 > ret_val) && 0 != try_num ); + LOC_GLUE_CHECK_RESULT(stat, int32); /* save the handle in the table */ loc_glue_callback_table[i].handle = (rpc_loc_client_handle_type) rets.loc_open_result; - ret_val = (rpc_loc_client_handle_type) rets.loc_open_result; - return ret_val; } diff --git a/loc_api/libloc_api_50001/loc_eng.cpp b/loc_api/libloc_api_50001/loc_eng.cpp index 9d231626..6199b211 100644 --- a/loc_api/libloc_api_50001/loc_eng.cpp +++ b/loc_api/libloc_api_50001/loc_eng.cpp @@ -348,14 +348,9 @@ int loc_eng_init(loc_eng_data_s_type &loc_eng_data, LocCallbacks* callbacks, } else { LOC_LOGD("loc_eng_init created client, id = %p\n", loc_eng_data.client_handle); - // call reinit to send initialization messages - int tries = 30; - while (tries > 0 && - LOC_API_ADAPTER_ERR_SUCCESS != (ret_val = loc_eng_reinit(loc_eng_data))) { - tries--; - LOC_LOGD("loc_eng_init client open failed, %d more tries", tries); - sleep(1); - } + /*send reinit event to QMI instead of call reinit directly*/ + loc_eng_msg *msg(new loc_eng_msg(locEngHandle.owner, LOC_ENG_MSG_LOC_INIT)); + locEngHandle.sendMsge(locEngHandle.owner, msg); } EXIT_LOG(%d, ret_val); @@ -1869,6 +1864,11 @@ static void loc_eng_deferred_action_thread(void* arg) } break; + case LOC_ENG_MSG_LOC_INIT: + { + loc_eng_reinit(*loc_eng_data_p); + } + default: LOC_LOGE("unsupported msgid = %d\n", msg->msgid); break; diff --git a/loc_api/libloc_api_50001/loc_eng_log.cpp b/loc_api/libloc_api_50001/loc_eng_log.cpp index 42be0d69..b0d64c68 100644 --- a/loc_api/libloc_api_50001/loc_eng_log.cpp +++ b/loc_api/libloc_api_50001/loc_eng_log.cpp @@ -107,7 +107,8 @@ static loc_name_val_s_type loc_eng_msgs[] = NAME_VAL( ULP_MSG_MONITOR ), NAME_VAL( LOC_ENG_MSG_LPP_CONFIG ), NAME_VAL( ULP_MSG_INJECT_RAW_COMMAND ), - NAME_VAL( LOC_ENG_MSG_A_GLONASS_PROTOCOL ) + NAME_VAL( LOC_ENG_MSG_A_GLONASS_PROTOCOL ), + NAME_VAL( LOC_ENG_MSG_LOC_INIT ) }; static int loc_eng_msgs_num = sizeof(loc_eng_msgs) / sizeof(loc_name_val_s_type); diff --git a/loc_api/libloc_api_50001/loc_eng_msg_id.h b/loc_api/libloc_api_50001/loc_eng_msg_id.h index 19a2ab6f..6d011240 100644 --- a/loc_api/libloc_api_50001/loc_eng_msg_id.h +++ b/loc_api/libloc_api_50001/loc_eng_msg_id.h @@ -133,6 +133,9 @@ enum loc_eng_msg_ids_t { /* Message is sent by HAL to LOC API to select A-GLONASS protocol */ LOC_ENG_MSG_A_GLONASS_PROTOCOL, + + //Message is sent by LOC to do LOC INIT + LOC_ENG_MSG_LOC_INIT, }; #ifdef __cplusplus