From c7642dca5f4bc58329341fa40102027ff422be71 Mon Sep 17 00:00:00 2001 From: Kevin Tang Date: Fri, 22 Sep 2017 17:28:58 -0700 Subject: [PATCH] locAPIRemoveGeofences now notify the result inmediately locAPIRemoveGeofences is no longer waiting for the request response, instead it will always notify his callbacks with LOCATION_ERROR_SUCCESS if the provided id is found, or LOCATION_ERROR_ID_UNKNOWN if not. Change-Id: I602ad43bee894e85fde1e80210e6477b628e4a39 CRs-fixed: 2099450 --- location/LocationAPIClientBase.cpp | 44 ++++++++---------------------- location/LocationAPIClientBase.h | 8 +----- 2 files changed, 13 insertions(+), 39 deletions(-) diff --git a/location/LocationAPIClientBase.cpp b/location/LocationAPIClientBase.cpp index 070c585f..4aa1ccbb 100644 --- a/location/LocationAPIClientBase.cpp +++ b/location/LocationAPIClientBase.cpp @@ -613,12 +613,22 @@ void LocationAPIClientBase::locAPIRemoveGeofences(size_t count, uint32_t* ids) if (mRequestQueues[REQUEST_GEOFENCE].getSession() == GEOFENCE_SESSION_ID) { size_t j = 0; + uint32_t id_cb; + LocationError err; for (size_t i = 0; i < count; i++) { sessions[j] = mGeofenceBiDict.getSession(ids[i]); + id_cb = ids[i]; if (sessions[j] > 0) { + mGeofenceBiDict.rmBySession(sessions[j]); + err = LOCATION_ERROR_SUCCESS; + onRemoveGeofencesCb(1, &err, &id_cb); j++; + } else { + err = LOCATION_ERROR_ID_UNKNOWN; + onRemoveGeofencesCb(1, &err, &id_cb); } } + if (j > 0) { mRequestQueues[REQUEST_GEOFENCE].push(new RemoveGeofencesRequest(*this)); mLocationAPI->removeGeofences(j, sessions); @@ -743,38 +753,8 @@ void LocationAPIClientBase::locAPIResumeGeofences( void LocationAPIClientBase::locAPIRemoveAllGeofences() { - pthread_mutex_lock(&mMutex); - if (mLocationAPI) { - std::vector sessionsVec = mGeofenceBiDict.getAllSessions(); - size_t count = sessionsVec.size(); - uint32_t* sessions = (uint32_t*)malloc(sizeof(uint32_t) * count); - if (sessions == NULL) { - LOC_LOGE("%s:%d] Failed to allocate %zu bytes !", - __FUNCTION__, __LINE__, sizeof(uint32_t) * count); - pthread_mutex_unlock(&mMutex); - return; - } - - if (mRequestQueues[REQUEST_GEOFENCE].getSession() == GEOFENCE_SESSION_ID) { - size_t j = 0; - for (size_t i = 0; i < count; i++) { - sessions[j] = sessionsVec[i]; - if (sessions[j] > 0) { - j++; - } - } - if (j > 0) { - mRequestQueues[REQUEST_GEOFENCE].push(new RemoveGeofencesRequest(*this)); - mLocationAPI->removeGeofences(j, sessions); - } - } else { - LOC_LOGE("%s:%d] invalid session: %d.", __FUNCTION__, __LINE__, - mRequestQueues[REQUEST_GEOFENCE].getSession()); - } - - free(sessions); - } - pthread_mutex_unlock(&mMutex); + std::vector sessionsVec = mGeofenceBiDict.getAllSessions(); + locAPIRemoveGeofences(sessionsVec.size(), &sessionsVec[0]); } void LocationAPIClientBase::locAPIGnssNiResponse(uint32_t id, GnssNiResponse response) diff --git a/location/LocationAPIClientBase.h b/location/LocationAPIClientBase.h index a8560548..78c8fa61 100644 --- a/location/LocationAPIClientBase.h +++ b/location/LocationAPIClientBase.h @@ -465,13 +465,7 @@ private: public: RemoveGeofencesRequest(LocationAPIClientBase& API) : mAPI(API) {} inline void onCollectiveResponse(size_t count, LocationError* errors, uint32_t* sessions) { - uint32_t *ids = (uint32_t*)malloc(sizeof(uint32_t) * count); - for (size_t i = 0; i < count; i++) { - ids[i] = mAPI.mGeofenceBiDict.getId(sessions[i]); - mAPI.mGeofenceBiDict.rmBySession(sessions[i]); - } - mAPI.onRemoveGeofencesCb(count, errors, ids); - free(ids); + // No need to handle collectiveResponse, cbs already notified } LocationAPIClientBase& mAPI; };