Invoking HIDL callback via local variable

Copying HIDL callback member variable to
a local variable before invoking.
This is to avoid possible race conditions
with the callback getting updated during
invocation.

Change-Id: Ida9658f4cffafc64754c0cd26541b731cb328155
CRs-Fixed: 2114085
This commit is contained in:
Saurabh Srivastava 2017-10-27 00:32:42 +05:30 committed by Baili Feng
parent 57640c9f33
commit 0107dbe7d3

View file

@ -278,7 +278,9 @@ void GnssAPIClient::onCapabilitiesCb(LocationCapabilitiesMask capabilitiesMask)
LOC_LOGD("%s]: (%02x)", __FUNCTION__, capabilitiesMask); LOC_LOGD("%s]: (%02x)", __FUNCTION__, capabilitiesMask);
mLocationCapabilitiesMask = capabilitiesMask; mLocationCapabilitiesMask = capabilitiesMask;
mLocationCapabilitiesCached = true; mLocationCapabilitiesCached = true;
if (mGnssCbIface != nullptr) { sp<IGnssCallback> gnssCbIface = mGnssCbIface;
if (gnssCbIface != nullptr) {
uint32_t data = 0; uint32_t data = 0;
if ((capabilitiesMask & LOCATION_CAPABILITIES_TIME_BASED_TRACKING_BIT) || if ((capabilitiesMask & LOCATION_CAPABILITIES_TIME_BASED_TRACKING_BIT) ||
(capabilitiesMask & LOCATION_CAPABILITIES_TIME_BASED_BATCHING_BIT) || (capabilitiesMask & LOCATION_CAPABILITIES_TIME_BASED_BATCHING_BIT) ||
@ -293,13 +295,13 @@ void GnssAPIClient::onCapabilitiesCb(LocationCapabilitiesMask capabilitiesMask)
data |= IGnssCallback::Capabilities::MSB; data |= IGnssCallback::Capabilities::MSB;
if (capabilitiesMask & LOCATION_CAPABILITIES_GNSS_MSA_BIT) if (capabilitiesMask & LOCATION_CAPABILITIES_GNSS_MSA_BIT)
data |= IGnssCallback::Capabilities::MSA; data |= IGnssCallback::Capabilities::MSA;
auto r = mGnssCbIface->gnssSetCapabilitesCb(data); auto r = gnssCbIface->gnssSetCapabilitesCb(data);
if (!r.isOk()) { if (!r.isOk()) {
LOC_LOGE("%s] Error from gnssSetCapabilitesCb description=%s", LOC_LOGE("%s] Error from gnssSetCapabilitesCb description=%s",
__func__, r.description().c_str()); __func__, r.description().c_str());
} }
} }
if (mGnssCbIface != nullptr) { if (gnssCbIface != nullptr) {
IGnssCallback::GnssSystemInfo gnssInfo; IGnssCallback::GnssSystemInfo gnssInfo;
if (capabilitiesMask & LOCATION_CAPABILITIES_DEBUG_NMEA_BIT) { if (capabilitiesMask & LOCATION_CAPABILITIES_DEBUG_NMEA_BIT) {
gnssInfo.yearOfHw = 2017; gnssInfo.yearOfHw = 2017;
@ -309,7 +311,7 @@ void GnssAPIClient::onCapabilitiesCb(LocationCapabilitiesMask capabilitiesMask)
gnssInfo.yearOfHw = 2015; gnssInfo.yearOfHw = 2015;
} }
LOC_LOGV("%s:%d] set_system_info_cb (%d)", __FUNCTION__, __LINE__, gnssInfo.yearOfHw); LOC_LOGV("%s:%d] set_system_info_cb (%d)", __FUNCTION__, __LINE__, gnssInfo.yearOfHw);
auto r = mGnssCbIface->gnssSetSystemInfoCb(gnssInfo); auto r = gnssCbIface->gnssSetSystemInfoCb(gnssInfo);
if (!r.isOk()) { if (!r.isOk()) {
LOC_LOGE("%s] Error from gnssSetSystemInfoCb description=%s", LOC_LOGE("%s] Error from gnssSetSystemInfoCb description=%s",
__func__, r.description().c_str()); __func__, r.description().c_str());
@ -320,10 +322,12 @@ void GnssAPIClient::onCapabilitiesCb(LocationCapabilitiesMask capabilitiesMask)
void GnssAPIClient::onTrackingCb(Location location) void GnssAPIClient::onTrackingCb(Location location)
{ {
LOC_LOGD("%s]: (flags: %02x)", __FUNCTION__, location.flags); LOC_LOGD("%s]: (flags: %02x)", __FUNCTION__, location.flags);
if (mGnssCbIface != nullptr) { sp<IGnssCallback> gnssCbIface = mGnssCbIface;
if (gnssCbIface != nullptr) {
GnssLocation gnssLocation; GnssLocation gnssLocation;
convertGnssLocation(location, gnssLocation); convertGnssLocation(location, gnssLocation);
auto r = mGnssCbIface->gnssLocationCb(gnssLocation); auto r = gnssCbIface->gnssLocationCb(gnssLocation);
if (!r.isOk()) { if (!r.isOk()) {
LOC_LOGE("%s] Error from gnssLocationCb description=%s", LOC_LOGE("%s] Error from gnssLocationCb description=%s",
__func__, r.description().c_str()); __func__, r.description().c_str());
@ -334,8 +338,9 @@ void GnssAPIClient::onTrackingCb(Location location)
void GnssAPIClient::onGnssNiCb(uint32_t id, GnssNiNotification gnssNiNotification) void GnssAPIClient::onGnssNiCb(uint32_t id, GnssNiNotification gnssNiNotification)
{ {
LOC_LOGD("%s]: (id: %d)", __FUNCTION__, id); LOC_LOGD("%s]: (id: %d)", __FUNCTION__, id);
sp<IGnssNiCallback> gnssNiCbIface = mGnssNiCbIface;
if (mGnssNiCbIface == nullptr) { if (gnssNiCbIface == nullptr) {
LOC_LOGE("%s]: mGnssNiCbIface is nullptr", __FUNCTION__); LOC_LOGE("%s]: mGnssNiCbIface is nullptr", __FUNCTION__);
return; return;
} }
@ -400,16 +405,18 @@ void GnssAPIClient::onGnssNiCb(uint32_t id, GnssNiNotification gnssNiNotificatio
notificationGnss.notificationIdEncoding = notificationGnss.notificationIdEncoding =
IGnssNiCallback::GnssNiEncodingType::ENC_SUPL_UCS2; IGnssNiCallback::GnssNiEncodingType::ENC_SUPL_UCS2;
mGnssNiCbIface->niNotifyCb(notificationGnss); gnssNiCbIface->niNotifyCb(notificationGnss);
} }
void GnssAPIClient::onGnssSvCb(GnssSvNotification gnssSvNotification) void GnssAPIClient::onGnssSvCb(GnssSvNotification gnssSvNotification)
{ {
LOC_LOGD("%s]: (count: %zu)", __FUNCTION__, gnssSvNotification.count); LOC_LOGD("%s]: (count: %zu)", __FUNCTION__, gnssSvNotification.count);
if (mGnssCbIface != nullptr) { sp<IGnssCallback> gnssCbIface = mGnssCbIface;
if (gnssCbIface != nullptr) {
IGnssCallback::GnssSvStatus svStatus; IGnssCallback::GnssSvStatus svStatus;
convertGnssSvStatus(gnssSvNotification, svStatus); convertGnssSvStatus(gnssSvNotification, svStatus);
auto r = mGnssCbIface->gnssSvStatusCb(svStatus); auto r = gnssCbIface->gnssSvStatusCb(svStatus);
if (!r.isOk()) { if (!r.isOk()) {
LOC_LOGE("%s] Error from gnssSvStatusCb description=%s", LOC_LOGE("%s] Error from gnssSvStatusCb description=%s",
__func__, r.description().c_str()); __func__, r.description().c_str());
@ -419,10 +426,12 @@ void GnssAPIClient::onGnssSvCb(GnssSvNotification gnssSvNotification)
void GnssAPIClient::onGnssNmeaCb(GnssNmeaNotification gnssNmeaNotification) void GnssAPIClient::onGnssNmeaCb(GnssNmeaNotification gnssNmeaNotification)
{ {
if (mGnssCbIface != nullptr) { sp<IGnssCallback> gnssCbIface = mGnssCbIface;
if (gnssCbIface != nullptr) {
android::hardware::hidl_string nmeaString; android::hardware::hidl_string nmeaString;
nmeaString.setToExternal(gnssNmeaNotification.nmea, gnssNmeaNotification.length); nmeaString.setToExternal(gnssNmeaNotification.nmea, gnssNmeaNotification.length);
auto r = mGnssCbIface->gnssNmeaCb( auto r = gnssCbIface->gnssNmeaCb(
static_cast<GnssUtcTime>(gnssNmeaNotification.timestamp), nmeaString); static_cast<GnssUtcTime>(gnssNmeaNotification.timestamp), nmeaString);
if (!r.isOk()) { if (!r.isOk()) {
LOC_LOGE("%s] Error from gnssNmeaCb nmea=%s length=%zu description=%s", __func__, LOC_LOGE("%s] Error from gnssNmeaCb nmea=%s length=%zu description=%s", __func__,
@ -434,13 +443,15 @@ void GnssAPIClient::onGnssNmeaCb(GnssNmeaNotification gnssNmeaNotification)
void GnssAPIClient::onStartTrackingCb(LocationError error) void GnssAPIClient::onStartTrackingCb(LocationError error)
{ {
LOC_LOGD("%s]: (%d)", __FUNCTION__, error); LOC_LOGD("%s]: (%d)", __FUNCTION__, error);
if (error == LOCATION_ERROR_SUCCESS && mGnssCbIface != nullptr) { sp<IGnssCallback> gnssCbIface = mGnssCbIface;
auto r = mGnssCbIface->gnssStatusCb(IGnssCallback::GnssStatusValue::ENGINE_ON);
if (error == LOCATION_ERROR_SUCCESS && gnssCbIface != nullptr) {
auto r = gnssCbIface->gnssStatusCb(IGnssCallback::GnssStatusValue::ENGINE_ON);
if (!r.isOk()) { if (!r.isOk()) {
LOC_LOGE("%s] Error from gnssStatusCb ENGINE_ON description=%s", LOC_LOGE("%s] Error from gnssStatusCb ENGINE_ON description=%s",
__func__, r.description().c_str()); __func__, r.description().c_str());
} }
r = mGnssCbIface->gnssStatusCb(IGnssCallback::GnssStatusValue::SESSION_BEGIN); r = gnssCbIface->gnssStatusCb(IGnssCallback::GnssStatusValue::SESSION_BEGIN);
if (!r.isOk()) { if (!r.isOk()) {
LOC_LOGE("%s] Error from gnssStatusCb SESSION_BEGIN description=%s", LOC_LOGE("%s] Error from gnssStatusCb SESSION_BEGIN description=%s",
__func__, r.description().c_str()); __func__, r.description().c_str());
@ -451,13 +462,15 @@ void GnssAPIClient::onStartTrackingCb(LocationError error)
void GnssAPIClient::onStopTrackingCb(LocationError error) void GnssAPIClient::onStopTrackingCb(LocationError error)
{ {
LOC_LOGD("%s]: (%d)", __FUNCTION__, error); LOC_LOGD("%s]: (%d)", __FUNCTION__, error);
if (error == LOCATION_ERROR_SUCCESS && mGnssCbIface != nullptr) { sp<IGnssCallback> gnssCbIface = mGnssCbIface;
auto r = mGnssCbIface->gnssStatusCb(IGnssCallback::GnssStatusValue::SESSION_END);
if (error == LOCATION_ERROR_SUCCESS && gnssCbIface != nullptr) {
auto r = gnssCbIface->gnssStatusCb(IGnssCallback::GnssStatusValue::SESSION_END);
if (!r.isOk()) { if (!r.isOk()) {
LOC_LOGE("%s] Error from gnssStatusCb SESSION_END description=%s", LOC_LOGE("%s] Error from gnssStatusCb SESSION_END description=%s",
__func__, r.description().c_str()); __func__, r.description().c_str());
} }
r = mGnssCbIface->gnssStatusCb(IGnssCallback::GnssStatusValue::ENGINE_OFF); r = gnssCbIface->gnssStatusCb(IGnssCallback::GnssStatusValue::ENGINE_OFF);
if (!r.isOk()) { if (!r.isOk()) {
LOC_LOGE("%s] Error from gnssStatusCb ENGINE_OFF description=%s", LOC_LOGE("%s] Error from gnssStatusCb ENGINE_OFF description=%s",
__func__, r.description().c_str()); __func__, r.description().c_str());