diff options
author | Dante Russo <drusso@codeaurora.org> | 2017-07-27 10:44:54 -0700 |
---|---|---|
committer | Dante Russo <drusso@codeaurora.org> | 2017-07-27 14:04:23 -0700 |
commit | c1da12aa2ee46d736fdce10351d1fa7c69f75824 (patch) | |
tree | 956d78565637ee23f30e1ec2bea45fe4645edeb7 /location/LocationAPIClientBase.cpp | |
parent | 7cc7da646c990160d6910daa9c1bad9e2eb18d2c (diff) | |
download | gps-c1da12aa2ee46d736fdce10351d1fa7c69f75824.tar.gz |
Prevent gps stuck on if multiple starts are called
If framework happens to call start of session multiple
times without calling stop first, it can cause a session
to get stuck on without any way to stop it
CRs-fixed: 2083756
Change-Id: Ic871d870ca67c9465438f8494e381bfbcb85a830
Diffstat (limited to 'location/LocationAPIClientBase.cpp')
-rw-r--r-- | location/LocationAPIClientBase.cpp | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/location/LocationAPIClientBase.cpp b/location/LocationAPIClientBase.cpp index 465b76d..1175770 100644 --- a/location/LocationAPIClientBase.cpp +++ b/location/LocationAPIClientBase.cpp @@ -223,7 +223,8 @@ LocationAPIClientBase::LocationAPIClientBase() : mGeofenceBreachCallback(nullptr), mBatchingStatusCallback(nullptr), mLocationAPI(nullptr), - mBatchSize(-1) + mBatchSize(-1), + mTracking(false) { // use recursive mutex, in case callback come from the same thread @@ -303,14 +304,18 @@ uint32_t LocationAPIClientBase::locAPIStartTracking(LocationOptions& options) uint32_t retVal = LOCATION_ERROR_GENERAL_FAILURE; pthread_mutex_lock(&mMutex); if (mLocationAPI) { - uint32_t session = mLocationAPI->startTracking(options); - LOC_LOGI("%s:%d] start new session: %d", __FUNCTION__, __LINE__, session); - // onResponseCb might be called from other thread immediately after - // startTracking returns, so we are not going to unlock mutex - // until StartTrackingRequest is pushed into mRequestQueues[REQUEST_TRACKING] - mRequestQueues[REQUEST_TRACKING].reset(session); - mRequestQueues[REQUEST_TRACKING].push(new StartTrackingRequest(*this)); - + if (mTracking) { + LOC_LOGW("%s:%d] Existing tracking session present", __FUNCTION__, __LINE__); + } else { + uint32_t session = mLocationAPI->startTracking(options); + LOC_LOGI("%s:%d] start new session: %d", __FUNCTION__, __LINE__, session); + // onResponseCb might be called from other thread immediately after + // startTracking returns, so we are not going to unlock mutex + // until StartTrackingRequest is pushed into mRequestQueues[REQUEST_TRACKING] + mRequestQueues[REQUEST_TRACKING].reset(session); + mRequestQueues[REQUEST_TRACKING].push(new StartTrackingRequest(*this)); + mTracking = true; + } retVal = LOCATION_ERROR_SUCCESS; } @@ -328,6 +333,7 @@ void LocationAPIClientBase::locAPIStopTracking() if (session > 0) { mRequestQueues[REQUEST_TRACKING].push(new StopTrackingRequest(*this)); mLocationAPI->stopTracking(session); + mTracking = false; } else { LOC_LOGE("%s:%d] invalid session: %d.", __FUNCTION__, __LINE__, session); } |