Return existing interfaces for repeated getExtension calls
Also, reset static state in destructors of interfaces.
Until now, new interfaces were being created for each repeated
getExtension() call to the Gnss interface. This was causing
asserts to fail which were checking for multiple
simultaneous instances of these interfaces.
Death notifications should still required to be created for all
interfaces including callback interfaces.
Bug: 35391416
Test: Verified that Maps still work after forcing a system_server
crash.
Change-Id: I8ce0888016637a3d9b62db5619a3c8c569262c0d
diff --git a/gnss/1.0/default/AGnss.cpp b/gnss/1.0/default/AGnss.cpp
index 52fdc26..29c6ddd 100644
--- a/gnss/1.0/default/AGnss.cpp
+++ b/gnss/1.0/default/AGnss.cpp
@@ -41,6 +41,7 @@
AGnss::~AGnss() {
sThreadFuncArgsList.clear();
+ sInterfaceExists = false;
}
void AGnss::statusCb(AGpsStatus* status) {
@@ -78,7 +79,10 @@
/*
* Callback to client with agnssStatusIpV4Cb.
*/
- sAGnssCbIface->agnssStatusIpV4Cb(aGnssStatusIpV4);
+ auto ret = sAGnssCbIface->agnssStatusIpV4Cb(aGnssStatusIpV4);
+ if (!ret.isOk()) {
+ ALOGE("%s: Unable to invoke callback", __func__);
+ }
break;
}
case AF_INET6:
@@ -96,7 +100,10 @@
&(status->addr));
memcpy(&(aGnssStatusIpV6.ipV6Addr[0]), in6->sin6_addr.s6_addr,
aGnssStatusIpV6.ipV6Addr.size());
- sAGnssCbIface->agnssStatusIpV6Cb(aGnssStatusIpV6);
+ auto ret = sAGnssCbIface->agnssStatusIpV6Cb(aGnssStatusIpV6);
+ if (!ret.isOk()) {
+ ALOGE("%s: Unable to invoke callback", __func__);
+ }
break;
}
default:
@@ -117,7 +124,10 @@
/*
* Callback to client with agnssStatusIpV4Cb.
*/
- sAGnssCbIface->agnssStatusIpV4Cb(aGnssStatusIpV4);
+ auto ret = sAGnssCbIface->agnssStatusIpV4Cb(aGnssStatusIpV4);
+ if (!ret.isOk()) {
+ ALOGE("%s: Unable to invoke callback", __func__);
+ }
} else {
ALOGE("%s: Invalid size for AGPS Status", __func__);
}
diff --git a/gnss/1.0/default/AGnssRil.cpp b/gnss/1.0/default/AGnssRil.cpp
index 480571d..1458327 100644
--- a/gnss/1.0/default/AGnssRil.cpp
+++ b/gnss/1.0/default/AGnssRil.cpp
@@ -42,6 +42,7 @@
AGnssRil::~AGnssRil() {
sThreadFuncArgsList.clear();
+ sInterfaceExists = false;
}
void AGnssRil::requestSetId(uint32_t flags) {
@@ -50,7 +51,10 @@
return;
}
- sAGnssRilCbIface->requestSetIdCb(flags);
+ auto ret = sAGnssRilCbIface->requestSetIdCb(flags);
+ if (!ret.isOk()) {
+ ALOGE("%s: Unable to invoke callback", __func__);
+ }
}
void AGnssRil::requestRefLoc(uint32_t /*flags*/) {
@@ -59,7 +63,10 @@
return;
}
- sAGnssRilCbIface->requestRefLocCb();
+ auto ret = sAGnssRilCbIface->requestRefLocCb();
+ if (!ret.isOk()) {
+ ALOGE("%s: Unable to invoke callback", __func__);
+ }
}
pthread_t AGnssRil::createThreadCb(const char* name, void (*start)(void*), void* arg) {
diff --git a/gnss/1.0/default/Gnss.cpp b/gnss/1.0/default/Gnss.cpp
index a2a99a0..10024fb 100644
--- a/gnss/1.0/default/Gnss.cpp
+++ b/gnss/1.0/default/Gnss.cpp
@@ -60,6 +60,7 @@
}
Gnss::~Gnss() {
+ sInterfaceExists = false;
sThreadFuncArgsList.clear();
}
@@ -75,7 +76,10 @@
}
android::hardware::gnss::V1_0::GnssLocation gnssLocation = convertToGnssLocation(location);
- sGnssCbIface->gnssLocationCb(gnssLocation);
+ auto ret = sGnssCbIface->gnssLocationCb(gnssLocation);
+ if (!ret.isOk()) {
+ ALOGE("%s: Unable to invoke callback", __func__);
+ }
}
void Gnss::statusCb(GpsStatus* gnssStatus) {
@@ -92,7 +96,10 @@
IGnssCallback::GnssStatusValue status =
static_cast<IGnssCallback::GnssStatusValue>(gnssStatus->status);
- sGnssCbIface->gnssStatusCb(status);
+ auto ret = sGnssCbIface->gnssStatusCb(status);
+ if (!ret.isOk()) {
+ ALOGE("%s: Unable to invoke callback", __func__);
+ }
}
void Gnss::gnssSvStatusCb(GnssSvStatus* status) {
@@ -131,7 +138,10 @@
svStatus.gnssSvList[i] = gnssSvInfo;
}
- sGnssCbIface->gnssSvStatusCb(svStatus);
+ auto ret = sGnssCbIface->gnssSvStatusCb(svStatus);
+ if (!ret.isOk()) {
+ ALOGE("%s: Unable to invoke callback", __func__);
+ }
}
/*
@@ -231,7 +241,10 @@
}
}
- sGnssCbIface->gnssSvStatusCb(svStatus);
+ auto ret = sGnssCbIface->gnssSvStatusCb(svStatus);
+ if (!ret.isOk()) {
+ ALOGE("%s: Unable to invoke callback", __func__);
+ }
}
void Gnss::nmeaCb(GpsUtcTime timestamp, const char* nmea, int length) {
@@ -242,7 +255,10 @@
android::hardware::hidl_string nmeaString;
nmeaString.setToExternal(nmea, length);
- sGnssCbIface->gnssNmeaCb(timestamp, nmeaString);
+ auto ret = sGnssCbIface->gnssNmeaCb(timestamp, nmeaString);
+ if (!ret.isOk()) {
+ ALOGE("%s: Unable to invoke callback", __func__);
+ }
}
void Gnss::setCapabilitiesCb(uint32_t capabilities) {
@@ -251,7 +267,10 @@
return;
}
- sGnssCbIface->gnssSetCapabilitesCb(capabilities);
+ auto ret = sGnssCbIface->gnssSetCapabilitesCb(capabilities);
+ if (!ret.isOk()) {
+ ALOGE("%s: Unable to invoke callback", __func__);
+ }
}
void Gnss::acquireWakelockCb() {
@@ -298,7 +317,10 @@
ALOGI("%s: GNSS HAL Wakelock acquired due to gps: %d, fused: %d", __func__,
sWakelockHeldGnss, sWakelockHeldFused);
sWakelockHeld = true;
- sGnssCbIface->gnssAcquireWakelockCb();
+ auto ret = sGnssCbIface->gnssAcquireWakelockCb();
+ if (!ret.isOk()) {
+ ALOGE("%s: Unable to invoke callback", __func__);
+ }
}
} else {
if (sWakelockHeld) {
@@ -309,7 +331,10 @@
ALOGW("%s: GNSS HAL Wakelock released, duplicate request", __func__);
}
sWakelockHeld = false;
- sGnssCbIface->gnssReleaseWakelockCb();
+ auto ret = sGnssCbIface->gnssReleaseWakelockCb();
+ if (!ret.isOk()) {
+ ALOGE("%s: Unable to invoke callback", __func__);
+ }
}
}
@@ -319,7 +344,10 @@
return;
}
- sGnssCbIface->gnssRequestTimeCb();
+ auto ret = sGnssCbIface->gnssRequestTimeCb();
+ if (!ret.isOk()) {
+ ALOGE("%s: Unable to invoke callback", __func__);
+ }
}
pthread_t Gnss::createThreadCb(const char* name, void (*start)(void*), void* arg) {
@@ -341,7 +369,10 @@
.yearOfHw = info->year_of_hw
};
- sGnssCbIface->gnssSetSystemInfoCb(gnssInfo);
+ auto ret = sGnssCbIface->gnssSetSystemInfoCb(gnssInfo);
+ if (!ret.isOk()) {
+ ALOGE("%s: Unable to invoke callback", __func__);
+ }
}
@@ -434,7 +465,10 @@
Return<sp<IAGnssRil>> Gnss::getExtensionAGnssRil() {
if (mGnssIface == nullptr) {
ALOGE("%s: Gnss interface is unavailable", __func__);
- } else {
+ return nullptr;
+ }
+
+ if (mGnssRil == nullptr) {
const AGpsRilInterface* agpsRilIface = static_cast<const AGpsRilInterface*>(
mGnssIface->get_extension(AGPS_RIL_INTERFACE));
if (agpsRilIface == nullptr) {
@@ -449,7 +483,10 @@
Return<sp<IGnssConfiguration>> Gnss::getExtensionGnssConfiguration() {
if (mGnssIface == nullptr) {
ALOGE("%s: Gnss interface is unavailable", __func__);
- } else {
+ return nullptr;
+ }
+
+ if (mGnssConfig == nullptr) {
const GnssConfigurationInterface* gnssConfigIface =
static_cast<const GnssConfigurationInterface*>(
mGnssIface->get_extension(GNSS_CONFIGURATION_INTERFACE));
@@ -462,10 +499,14 @@
}
return mGnssConfig;
}
+
Return<sp<IGnssGeofencing>> Gnss::getExtensionGnssGeofencing() {
if (mGnssIface == nullptr) {
ALOGE("%s: Gnss interface is unavailable", __func__);
- } else {
+ return nullptr;
+ }
+
+ if (mGnssGeofencingIface == nullptr) {
const GpsGeofencingInterface* gpsGeofencingIface =
static_cast<const GpsGeofencingInterface*>(
mGnssIface->get_extension(GPS_GEOFENCING_INTERFACE));
@@ -483,7 +524,10 @@
Return<sp<IAGnss>> Gnss::getExtensionAGnss() {
if (mGnssIface == nullptr) {
ALOGE("%s: Gnss interface is unavailable", __func__);
- } else {
+ return nullptr;
+ }
+
+ if (mAGnssIface == nullptr) {
const AGpsInterface* agpsIface = static_cast<const AGpsInterface*>(
mGnssIface->get_extension(AGPS_INTERFACE));
if (agpsIface == nullptr) {
@@ -498,7 +542,10 @@
Return<sp<IGnssNi>> Gnss::getExtensionGnssNi() {
if (mGnssIface == nullptr) {
ALOGE("%s: Gnss interface is unavailable", __func__);
- } else {
+ return nullptr;
+ }
+
+ if (mGnssNi == nullptr) {
const GpsNiInterface* gpsNiIface = static_cast<const GpsNiInterface*>(
mGnssIface->get_extension(GPS_NI_INTERFACE));
if (gpsNiIface == nullptr) {
@@ -513,7 +560,10 @@
Return<sp<IGnssMeasurement>> Gnss::getExtensionGnssMeasurement() {
if (mGnssIface == nullptr) {
ALOGE("%s: Gnss interface is unavailable", __func__);
- } else {
+ return nullptr;
+ }
+
+ if (mGnssMeasurement == nullptr) {
const GpsMeasurementInterface* gpsMeasurementIface =
static_cast<const GpsMeasurementInterface*>(
mGnssIface->get_extension(GPS_MEASUREMENT_INTERFACE));
@@ -530,7 +580,10 @@
Return<sp<IGnssNavigationMessage>> Gnss::getExtensionGnssNavigationMessage() {
if (mGnssIface == nullptr) {
ALOGE("%s: Gnss interface is unavailable", __func__);
- } else {
+ return nullptr;
+ }
+
+ if (mGnssNavigationMessage == nullptr) {
const GpsNavigationMessageInterface* gpsNavigationMessageIface =
static_cast<const GpsNavigationMessageInterface*>(
mGnssIface->get_extension(GPS_NAVIGATION_MESSAGE_INTERFACE));
@@ -549,7 +602,10 @@
Return<sp<IGnssXtra>> Gnss::getExtensionXtra() {
if (mGnssIface == nullptr) {
ALOGE("%s: Gnss interface is unavailable", __func__);
- } else {
+ return nullptr;
+ }
+
+ if (mGnssXtraIface == nullptr) {
const GpsXtraInterface* gpsXtraIface = static_cast<const GpsXtraInterface*>(
mGnssIface->get_extension(GPS_XTRA_INTERFACE));
@@ -566,7 +622,10 @@
Return<sp<IGnssDebug>> Gnss::getExtensionGnssDebug() {
if (mGnssIface == nullptr) {
ALOGE("%s: Gnss interface is unavailable", __func__);
- } else {
+ return nullptr;
+ }
+
+ if (mGnssDebug == nullptr) {
const GpsDebugInterface* gpsDebugIface = static_cast<const GpsDebugInterface*>(
mGnssIface->get_extension(GPS_DEBUG_INTERFACE));
@@ -583,7 +642,10 @@
Return<sp<IGnssBatching>> Gnss::getExtensionGnssBatching() {
if (mGnssIface == nullptr) {
ALOGE("%s: Gnss interface is unavailable", __func__);
- } else {
+ return nullptr;
+ }
+
+ if (mGnssBatching == nullptr) {
hw_module_t* module;
const FlpLocationInterface* flpLocationIface = nullptr;
int err = hw_get_module(FUSED_LOCATION_HARDWARE_MODULE_ID, (hw_module_t const**)&module);
diff --git a/gnss/1.0/default/GnssBatching.cpp b/gnss/1.0/default/GnssBatching.cpp
index 95c5e60..42f1473 100644
--- a/gnss/1.0/default/GnssBatching.cpp
+++ b/gnss/1.0/default/GnssBatching.cpp
@@ -103,7 +103,10 @@
gnssLocations.push_back(convertToGnssLocation(locations[iLocation]));
}
- sGnssBatchingCbIface->gnssLocationBatchCb(gnssLocations);
+ auto ret = sGnssBatchingCbIface->gnssLocationBatchCb(gnssLocations);
+ if (!ret.isOk()) {
+ ALOGE("%s: Unable to invoke callback", __func__);
+ }
}
void GnssBatching::acquireWakelockCb() {
diff --git a/gnss/1.0/default/GnssGeofencing.cpp b/gnss/1.0/default/GnssGeofencing.cpp
index f42de42..54c4aaa 100644
--- a/gnss/1.0/default/GnssGeofencing.cpp
+++ b/gnss/1.0/default/GnssGeofencing.cpp
@@ -48,6 +48,7 @@
GnssGeofencing::~GnssGeofencing() {
sThreadFuncArgsList.clear();
+ sInterfaceExists = false;
}
void GnssGeofencing::gnssGfTransitionCb(int32_t geofenceId,
GpsLocation* location,
@@ -64,11 +65,14 @@
}
GnssLocation gnssLocation = convertToGnssLocation(location);
- mGnssGeofencingCbIface->gnssGeofenceTransitionCb(
+ auto ret = mGnssGeofencingCbIface->gnssGeofenceTransitionCb(
geofenceId,
gnssLocation,
static_cast<IGnssGeofenceCallback::GeofenceTransition>(transition),
timestamp);
+ if (!ret.isOk()) {
+ ALOGE("%s: Unable to invoke callback", __func__);
+ }
}
void GnssGeofencing::gnssGfStatusCb(int32_t status, GpsLocation* location) {
@@ -85,8 +89,11 @@
gnssLocation = {};
}
- mGnssGeofencingCbIface->gnssGeofenceStatusCb(
+ auto ret = mGnssGeofencingCbIface->gnssGeofenceStatusCb(
static_cast<IGnssGeofenceCallback::GeofenceAvailability>(status), gnssLocation);
+ if (!ret.isOk()) {
+ ALOGE("%s: Unable to invoke callback", __func__);
+ }
}
void GnssGeofencing::gnssGfAddCb(int32_t geofenceId, int32_t status) {
@@ -95,8 +102,11 @@
return;
}
- mGnssGeofencingCbIface->gnssGeofenceAddCb(
+ auto ret = mGnssGeofencingCbIface->gnssGeofenceAddCb(
geofenceId, static_cast<IGnssGeofenceCallback::GeofenceStatus>(status));
+ if (!ret.isOk()) {
+ ALOGE("%s: Unable to invoke callback", __func__);
+ }
}
void GnssGeofencing::gnssGfRemoveCb(int32_t geofenceId, int32_t status) {
@@ -105,8 +115,11 @@
return;
}
- mGnssGeofencingCbIface->gnssGeofenceRemoveCb(
- geofenceId, static_cast<IGnssGeofenceCallback::GeofenceStatus>(status));
+ auto ret = mGnssGeofencingCbIface->gnssGeofenceRemoveCb(
+ geofenceId, static_cast<IGnssGeofenceCallback::GeofenceStatus>(status));
+ if (!ret.isOk()) {
+ ALOGE("%s: Unable to invoke callback", __func__);
+ }
}
void GnssGeofencing::gnssGfPauseCb(int32_t geofenceId, int32_t status) {
@@ -115,8 +128,11 @@
return;
}
- mGnssGeofencingCbIface->gnssGeofencePauseCb(
+ auto ret = mGnssGeofencingCbIface->gnssGeofencePauseCb(
geofenceId, static_cast<IGnssGeofenceCallback::GeofenceStatus>(status));
+ if (!ret.isOk()) {
+ ALOGE("%s: Unable to invoke callback", __func__);
+ }
}
void GnssGeofencing::gnssGfResumeCb(int32_t geofenceId, int32_t status) {
@@ -125,8 +141,11 @@
return;
}
- mGnssGeofencingCbIface->gnssGeofenceResumeCb(
+ auto ret = mGnssGeofencingCbIface->gnssGeofenceResumeCb(
geofenceId, static_cast<IGnssGeofenceCallback::GeofenceStatus>(status));
+ if (!ret.isOk()) {
+ ALOGE("%s: Unable to invoke callback", __func__);
+ }
}
pthread_t GnssGeofencing::createThreadCb(const char* name, void (*start)(void*), void* arg) {
diff --git a/gnss/1.0/default/GnssMeasurement.cpp b/gnss/1.0/default/GnssMeasurement.cpp
index 67f6d8d..6c9b838 100644
--- a/gnss/1.0/default/GnssMeasurement.cpp
+++ b/gnss/1.0/default/GnssMeasurement.cpp
@@ -96,7 +96,10 @@
.hwClockDiscontinuityCount = clockVal.hw_clock_discontinuity_count
};
- sGnssMeasureCbIface->GnssMeasurementCb(gnssData);
+ auto ret = sGnssMeasureCbIface->GnssMeasurementCb(gnssData);
+ if (!ret.isOk()) {
+ ALOGE("%s: Unable to invoke callback", __func__);
+ }
}
/*
@@ -223,7 +226,10 @@
gnssData.clock.driftUncertaintyNsps = clockVal.drift_uncertainty_nsps;
gnssData.clock.gnssClockFlags = clockVal.flags;
- sGnssMeasureCbIface->GnssMeasurementCb(gnssData);
+ auto ret = sGnssMeasureCbIface->GnssMeasurementCb(gnssData);
+ if (!ret.isOk()) {
+ ALOGE("%s: Unable to invoke callback", __func__);
+ }
}
// Methods from ::android::hardware::gnss::V1_0::IGnssMeasurement follow.
diff --git a/gnss/1.0/default/GnssNavigationMessage.cpp b/gnss/1.0/default/GnssNavigationMessage.cpp
index c98abf6..6f509d0 100644
--- a/gnss/1.0/default/GnssNavigationMessage.cpp
+++ b/gnss/1.0/default/GnssNavigationMessage.cpp
@@ -59,7 +59,10 @@
navigationMsg.submessageId = message->submessage_id;
navigationMsg.data.setToExternal(message->data, message->data_length);
- sGnssNavigationMsgCbIface->gnssNavigationMessageCb(navigationMsg);
+ auto ret = sGnssNavigationMsgCbIface->gnssNavigationMessageCb(navigationMsg);
+ if (!ret.isOk()) {
+ ALOGE("%s: Unable to invoke callback", __func__);
+ }
}
// Methods from ::android::hardware::gnss::V1_0::IGnssNavigationMessage follow.
diff --git a/gnss/1.0/default/GnssNi.cpp b/gnss/1.0/default/GnssNi.cpp
index ec57e8c..d17891d 100644
--- a/gnss/1.0/default/GnssNi.cpp
+++ b/gnss/1.0/default/GnssNi.cpp
@@ -41,6 +41,7 @@
GnssNi::~GnssNi() {
sThreadFuncArgsList.clear();
+ sInterfaceExists = false;
}
pthread_t GnssNi::createThreadCb(const char* name, void (*start)(void*), void* arg) {
@@ -73,7 +74,10 @@
static_cast<IGnssNiCallback::GnssNiEncodingType>(notification->text_encoding)
};
- sGnssNiCbIface->niNotifyCb(notificationGnss);
+ auto ret = sGnssNiCbIface->niNotifyCb(notificationGnss);
+ if (!ret.isOk()) {
+ ALOGE("%s: Unable to invoke callback", __func__);
+ }
}
// Methods from ::android::hardware::gnss::V1_0::IGnssNi follow.
diff --git a/gnss/1.0/default/GnssXtra.cpp b/gnss/1.0/default/GnssXtra.cpp
index 065bb33..d124ce1 100644
--- a/gnss/1.0/default/GnssXtra.cpp
+++ b/gnss/1.0/default/GnssXtra.cpp
@@ -35,6 +35,7 @@
GnssXtra::~GnssXtra() {
sThreadFuncArgsList.clear();
+ sInterfaceExists = false;
}
pthread_t GnssXtra::createThreadCb(const char* name, void (*start)(void*), void* arg) {
@@ -53,7 +54,10 @@
return;
}
- sGnssXtraCbIface->downloadRequestCb();
+ auto ret = sGnssXtraCbIface->downloadRequestCb();
+ if (!ret.isOk()) {
+ ALOGE("%s: Unable to invoke callback", __func__);
+ }
}
// Methods from ::android::hardware::gnss::V1_0::IGnssXtra follow.