diff options
author | Amit Mahajan <amitmahajan@google.com> | 2018-03-01 01:10:47 +0000 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2018-03-01 01:10:47 +0000 |
commit | a2e8af50ea84bbb24cad2f63591aab4cbac63b8c (patch) | |
tree | 4fc9b7f9658932d6ec34b1c33f679d09b2b76bec | |
parent | 1150e6b7386fb269fdcdb7b0706aaeb62c8237a7 (diff) | |
parent | 0406228af4778ceb258a5165904009b5e7c87109 (diff) | |
download | platform_hardware_ril-a2e8af50ea84bbb24cad2f63591aab4cbac63b8c.tar.gz platform_hardware_ril-a2e8af50ea84bbb24cad2f63591aab4cbac63b8c.tar.bz2 platform_hardware_ril-a2e8af50ea84bbb24cad2f63591aab4cbac63b8c.zip |
Merge "Store the system time when NITZ is received." am: 236f668034
am: 0406228af4
Change-Id: Iaf9208530732e177c27c0f3ba8c6b28161005c01
-rw-r--r-- | libril/ril.cpp | 23 | ||||
-rw-r--r-- | libril/ril_service.cpp | 13 | ||||
-rw-r--r-- | libril/ril_service.h | 2 |
3 files changed, 33 insertions, 5 deletions
diff --git a/libril/ril.cpp b/libril/ril.cpp index 52d574d0..514ac903 100644 --- a/libril/ril.cpp +++ b/libril/ril.cpp @@ -285,6 +285,13 @@ static void resendLastNITZTimeData(RIL_SOCKET_ID socket_id) { int responseType = (s_callbacks.version >= 13) ? RESPONSE_UNSOLICITED_ACK_EXP : RESPONSE_UNSOLICITED; + // acquire read lock for the service before calling nitzTimeReceivedInd() since it reads + // nitzTimeReceived in ril_service + pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock( + (int) socket_id); + int rwlockRet = pthread_rwlock_rdlock(radioServiceRwlockPtr); + assert(rwlockRet == 0); + int ret = radio::nitzTimeReceivedInd( (int)socket_id, responseType, 0, RIL_E_SUCCESS, s_lastNITZTimeData, s_lastNITZTimeDataSize); @@ -292,6 +299,9 @@ static void resendLastNITZTimeData(RIL_SOCKET_ID socket_id) { free(s_lastNITZTimeData); s_lastNITZTimeData = NULL; } + + rwlockRet = pthread_rwlock_unlock(radioServiceRwlockPtr); + assert(rwlockRet == 0); } } @@ -770,8 +780,17 @@ void RIL_onUnsolicitedResponse(int unsolResponse, const void *data, } pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock((int) soc_id); - int rwlockRet = pthread_rwlock_rdlock(radioServiceRwlockPtr); - assert(rwlockRet == 0); + int rwlockRet; + + if (unsolResponse == RIL_UNSOL_NITZ_TIME_RECEIVED) { + // get a write lock in caes of NITZ since setNitzTimeReceived() is called + rwlockRet = pthread_rwlock_wrlock(radioServiceRwlockPtr); + assert(rwlockRet == 0); + radio::setNitzTimeReceived((int) soc_id, android::elapsedRealtime()); + } else { + rwlockRet = pthread_rwlock_rdlock(radioServiceRwlockPtr); + assert(rwlockRet == 0); + } ret = s_unsolResponses[unsolResponseIndex].responseFunction( (int) soc_id, responseType, 0, RIL_E_SUCCESS, const_cast<void*>(data), diff --git a/libril/ril_service.cpp b/libril/ril_service.cpp index 9b9b6413..d90ba9ca 100644 --- a/libril/ril_service.cpp +++ b/libril/ril_service.cpp @@ -69,12 +69,14 @@ struct OemHookImpl; #if (SIM_COUNT >= 2) sp<RadioImpl> radioService[SIM_COUNT]; sp<OemHookImpl> oemHookService[SIM_COUNT]; +int64_t nitzTimeReceived[SIM_COUNT]; // counter used for synchronization. It is incremented every time response callbacks are updated. volatile int32_t mCounterRadio[SIM_COUNT]; volatile int32_t mCounterOemHook[SIM_COUNT]; #else sp<RadioImpl> radioService[1]; sp<OemHookImpl> oemHookService[1]; +int64_t nitzTimeReceived[1]; // counter used for synchronization. It is incremented every time response callbacks are updated. volatile int32_t mCounterRadio[1]; volatile int32_t mCounterOemHook[1]; @@ -6977,13 +6979,13 @@ int radio::nitzTimeReceivedInd(int slotId, return 0; } hidl_string nitzTime = convertCharPtrToHidlString((char *) response); - int64_t timeReceived = android::elapsedRealtime(); #if VDBG RLOGD("nitzTimeReceivedInd: nitzTime %s receivedTime %" PRId64, nitzTime.c_str(), - timeReceived); + nitzTimeReceived[slotId]); #endif Return<void> retStatus = radioService[slotId]->mRadioIndication->nitzTimeReceived( - convertIntToRadioIndicationType(indicationType), nitzTime, timeReceived); + convertIntToRadioIndicationType(indicationType), nitzTime, + nitzTimeReceived[slotId]); radioService[slotId]->checkReturnStatus(retStatus); } else { RLOGE("nitzTimeReceivedInd: radioService[%d]->mRadioIndication == NULL", slotId); @@ -8528,3 +8530,8 @@ pthread_rwlock_t * radio::getRadioServiceRwlock(int slotId) { return radioServiceRwlockPtr; } + +// should acquire write lock for the corresponding service before calling this +void radio::setNitzTimeReceived(int slotId, long timeReceived) { + nitzTimeReceived[slotId] = timeReceived; +} diff --git a/libril/ril_service.h b/libril/ril_service.h index 2240e2a2..870b644e 100644 --- a/libril/ril_service.h +++ b/libril/ril_service.h @@ -743,6 +743,8 @@ int carrierInfoForImsiEncryption(int slotId, pthread_rwlock_t * getRadioServiceRwlock(int slotId); +void setNitzTimeReceived(int slotId, long timeReceived); + } // namespace radio #endif // RIL_SERVICE_H |