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:
parent
57640c9f33
commit
0107dbe7d3
1 changed files with 31 additions and 18 deletions
|
@ -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());
|
||||||
|
|
Loading…
Reference in a new issue