summaryrefslogtreecommitdiff
path: root/location/LocationAPIClientBase.cpp
diff options
context:
space:
mode:
authorDante Russo <drusso@codeaurora.org>2017-07-27 10:44:54 -0700
committerDante Russo <drusso@codeaurora.org>2017-07-27 14:04:23 -0700
commitc1da12aa2ee46d736fdce10351d1fa7c69f75824 (patch)
tree956d78565637ee23f30e1ec2bea45fe4645edeb7 /location/LocationAPIClientBase.cpp
parent7cc7da646c990160d6910daa9c1bad9e2eb18d2c (diff)
downloadgps-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.cpp24
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);
}