fixed a potential race condition in managing gps lock

gnssConfigRequested in setConfigCommand handling currently gets
data into gnssConfigRequested in LocApi thread. This introduces
race condition that adapter.getAfwControlId() could be called
from a different thread than where adapter.setAfwControlId() is
called.

CRs-fixed: 2453439

Change-Id: I75ce482a4a87436dff04972ffd82b48db3af62c1
This commit is contained in:
Kevin Tang 2019-05-17 18:04:32 -07:00 committed by Gerrit - the friendly Code Review server
parent 3b8395fe7b
commit 7490804ed9

View file

@ -714,90 +714,91 @@ GnssAdapter::setConfigCommand()
loc_gps_cfg_s gpsConf = ContextBase::mGps_conf; loc_gps_cfg_s gpsConf = ContextBase::mGps_conf;
loc_sap_cfg_s_type sapConf = ContextBase::mSap_conf; loc_sap_cfg_s_type sapConf = ContextBase::mSap_conf;
mApi.sendMsg(new LocApiMsg( //cache the injected configuration with GnssConfigRequested struct
[&adapter, gpsConf, sapConf, oldServerUrl, oldMoServerUrl] () { GnssConfig gnssConfigRequested = {};
//cache the injected configuration with GnssConfigRequested struct gnssConfigRequested.flags |= GNSS_CONFIG_FLAGS_GPS_LOCK_VALID_BIT |
GnssConfig gnssConfigRequested = {}; GNSS_CONFIG_FLAGS_LPPE_CONTROL_PLANE_VALID_BIT |
gnssConfigRequested.flags |= GNSS_CONFIG_FLAGS_GPS_LOCK_VALID_BIT | GNSS_CONFIG_FLAGS_LPPE_USER_PLANE_VALID_BIT |
GNSS_CONFIG_FLAGS_LPPE_CONTROL_PLANE_VALID_BIT | GNSS_CONFIG_FLAGS_BLACKLISTED_SV_IDS_BIT;
GNSS_CONFIG_FLAGS_LPPE_USER_PLANE_VALID_BIT | gnssConfigRequested.gpsLock = GNSS_CONFIG_GPS_LOCK_NONE;
GNSS_CONFIG_FLAGS_BLACKLISTED_SV_IDS_BIT; if (0 == adapter.getAfwControlId() || NULL != adapter.mNfwCb) {
gnssConfigRequested.gpsLock = GNSS_CONFIG_GPS_LOCK_NONE; gnssConfigRequested.gpsLock = gpsConf.GPS_LOCK;
if (0 == adapter.getAfwControlId() || NULL != adapter.mNfwCb) { }
gnssConfigRequested.gpsLock = gpsConf.GPS_LOCK;
}
if (gpsConf.AGPS_CONFIG_INJECT) { if (gpsConf.AGPS_CONFIG_INJECT) {
gnssConfigRequested.flags |= GNSS_CONFIG_FLAGS_SET_ASSISTANCE_DATA_VALID_BIT | gnssConfigRequested.flags |= GNSS_CONFIG_FLAGS_SET_ASSISTANCE_DATA_VALID_BIT |
GNSS_CONFIG_FLAGS_SUPL_VERSION_VALID_BIT | GNSS_CONFIG_FLAGS_SUPL_VERSION_VALID_BIT |
GNSS_CONFIG_FLAGS_AGLONASS_POSITION_PROTOCOL_VALID_BIT | GNSS_CONFIG_FLAGS_AGLONASS_POSITION_PROTOCOL_VALID_BIT |
GNSS_CONFIG_FLAGS_LPP_PROFILE_VALID_BIT; GNSS_CONFIG_FLAGS_LPP_PROFILE_VALID_BIT;
gnssConfigRequested.suplVersion = gnssConfigRequested.suplVersion =
adapter.mLocApi->convertSuplVersion(gpsConf.SUPL_VER); adapter.mLocApi->convertSuplVersion(gpsConf.SUPL_VER);
gnssConfigRequested.lppProfile = gnssConfigRequested.lppProfile =
adapter.mLocApi->convertLppProfile(gpsConf.LPP_PROFILE); adapter.mLocApi->convertLppProfile(gpsConf.LPP_PROFILE);
gnssConfigRequested.aGlonassPositionProtocolMask = gnssConfigRequested.aGlonassPositionProtocolMask =
gpsConf.A_GLONASS_POS_PROTOCOL_SELECT; gpsConf.A_GLONASS_POS_PROTOCOL_SELECT;
} }
gnssConfigRequested.lppeControlPlaneMask = gnssConfigRequested.lppeControlPlaneMask =
adapter.mLocApi->convertLppeCp(gpsConf.LPPE_CP_TECHNOLOGY); adapter.mLocApi->convertLppeCp(gpsConf.LPPE_CP_TECHNOLOGY);
gnssConfigRequested.lppeUserPlaneMask = gnssConfigRequested.lppeUserPlaneMask =
adapter.mLocApi->convertLppeUp(gpsConf.LPPE_UP_TECHNOLOGY); adapter.mLocApi->convertLppeUp(gpsConf.LPPE_UP_TECHNOLOGY);
gnssConfigRequested.blacklistedSvIds.assign(adapter.mBlacklistedSvIds.begin(), gnssConfigRequested.blacklistedSvIds.assign(adapter.mBlacklistedSvIds.begin(),
adapter.mBlacklistedSvIds.end()); adapter.mBlacklistedSvIds.end());
adapter.gnssUpdateConfig(oldServerUrl, oldMoServerUrl, gnssConfigRequested, mApi.sendMsg(new LocApiMsg(
gnssConfigRequested); [&adapter, gpsConf, sapConf, oldServerUrl,
oldMoServerUrl, gnssConfigRequested] () {
adapter.gnssUpdateConfig(oldServerUrl, oldMoServerUrl, gnssConfigRequested,
gnssConfigRequested);
// set nmea mask type // set nmea mask type
uint32_t mask = 0; uint32_t mask = 0;
if (NMEA_PROVIDER_MP == gpsConf.NMEA_PROVIDER) { if (NMEA_PROVIDER_MP == gpsConf.NMEA_PROVIDER) {
mask |= LOC_NMEA_ALL_GENERAL_SUPPORTED_MASK; mask |= LOC_NMEA_ALL_GENERAL_SUPPORTED_MASK;
} }
if (ContextBase::isFeatureSupported(LOC_SUPPORTED_FEATURE_DEBUG_NMEA_V02)) { if (ContextBase::isFeatureSupported(LOC_SUPPORTED_FEATURE_DEBUG_NMEA_V02)) {
mask |= LOC_NMEA_MASK_DEBUG_V02; mask |= LOC_NMEA_MASK_DEBUG_V02;
} }
if (mask != 0) { if (mask != 0) {
adapter.mLocApi->setNMEATypesSync(mask); adapter.mLocApi->setNMEATypesSync(mask);
} }
adapter.mLocApi->setXtraVersionCheckSync(gpsConf.XTRA_VERSION_CHECK); adapter.mLocApi->setXtraVersionCheckSync(gpsConf.XTRA_VERSION_CHECK);
adapter.mLocApi->setConstrainedTuncMode( adapter.mLocApi->setConstrainedTuncMode(
gpsConf.CONSTRAINED_TIME_UNCERTAINTY_ENABLED == 1, gpsConf.CONSTRAINED_TIME_UNCERTAINTY_ENABLED == 1,
(float)gpsConf.CONSTRAINED_TIME_UNCERTAINTY_THRESHOLD, (float)gpsConf.CONSTRAINED_TIME_UNCERTAINTY_THRESHOLD,
gpsConf.CONSTRAINED_TIME_UNCERTAINTY_ENERGY_BUDGET); gpsConf.CONSTRAINED_TIME_UNCERTAINTY_ENERGY_BUDGET);
adapter.mLocApi->setPositionAssistedClockEstimatorMode( adapter.mLocApi->setPositionAssistedClockEstimatorMode(
gpsConf.POSITION_ASSISTED_CLOCK_ESTIMATOR_ENABLED == 1); gpsConf.POSITION_ASSISTED_CLOCK_ESTIMATOR_ENABLED == 1);
if (sapConf.GYRO_BIAS_RANDOM_WALK_VALID || if (sapConf.GYRO_BIAS_RANDOM_WALK_VALID ||
sapConf.ACCEL_RANDOM_WALK_SPECTRAL_DENSITY_VALID || sapConf.ACCEL_RANDOM_WALK_SPECTRAL_DENSITY_VALID ||
sapConf.ANGLE_RANDOM_WALK_SPECTRAL_DENSITY_VALID || sapConf.ANGLE_RANDOM_WALK_SPECTRAL_DENSITY_VALID ||
sapConf.RATE_RANDOM_WALK_SPECTRAL_DENSITY_VALID || sapConf.RATE_RANDOM_WALK_SPECTRAL_DENSITY_VALID ||
sapConf.VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY_VALID ) { sapConf.VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY_VALID ) {
adapter.mLocApi->setSensorPropertiesSync( adapter.mLocApi->setSensorPropertiesSync(
sapConf.GYRO_BIAS_RANDOM_WALK_VALID, sapConf.GYRO_BIAS_RANDOM_WALK_VALID,
sapConf.GYRO_BIAS_RANDOM_WALK, sapConf.GYRO_BIAS_RANDOM_WALK,
sapConf.ACCEL_RANDOM_WALK_SPECTRAL_DENSITY_VALID, sapConf.ACCEL_RANDOM_WALK_SPECTRAL_DENSITY_VALID,
sapConf.ACCEL_RANDOM_WALK_SPECTRAL_DENSITY, sapConf.ACCEL_RANDOM_WALK_SPECTRAL_DENSITY,
sapConf.ANGLE_RANDOM_WALK_SPECTRAL_DENSITY_VALID, sapConf.ANGLE_RANDOM_WALK_SPECTRAL_DENSITY_VALID,
sapConf.ANGLE_RANDOM_WALK_SPECTRAL_DENSITY, sapConf.ANGLE_RANDOM_WALK_SPECTRAL_DENSITY,
sapConf.RATE_RANDOM_WALK_SPECTRAL_DENSITY_VALID, sapConf.RATE_RANDOM_WALK_SPECTRAL_DENSITY_VALID,
sapConf.RATE_RANDOM_WALK_SPECTRAL_DENSITY, sapConf.RATE_RANDOM_WALK_SPECTRAL_DENSITY,
sapConf.VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY_VALID, sapConf.VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY_VALID,
sapConf.VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY); sapConf.VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY);
} }
adapter.mLocApi->setSensorPerfControlConfigSync( adapter.mLocApi->setSensorPerfControlConfigSync(
sapConf.SENSOR_CONTROL_MODE, sapConf.SENSOR_CONTROL_MODE,
sapConf.SENSOR_ACCEL_SAMPLES_PER_BATCH, sapConf.SENSOR_ACCEL_SAMPLES_PER_BATCH,
sapConf.SENSOR_ACCEL_BATCHES_PER_SEC, sapConf.SENSOR_ACCEL_BATCHES_PER_SEC,
sapConf.SENSOR_GYRO_SAMPLES_PER_BATCH, sapConf.SENSOR_GYRO_SAMPLES_PER_BATCH,
sapConf.SENSOR_GYRO_BATCHES_PER_SEC, sapConf.SENSOR_GYRO_BATCHES_PER_SEC,
sapConf.SENSOR_ACCEL_SAMPLES_PER_BATCH_HIGH, sapConf.SENSOR_ACCEL_SAMPLES_PER_BATCH_HIGH,
sapConf.SENSOR_ACCEL_BATCHES_PER_SEC_HIGH, sapConf.SENSOR_ACCEL_BATCHES_PER_SEC_HIGH,
sapConf.SENSOR_GYRO_SAMPLES_PER_BATCH_HIGH, sapConf.SENSOR_GYRO_SAMPLES_PER_BATCH_HIGH,
sapConf.SENSOR_GYRO_BATCHES_PER_SEC_HIGH, sapConf.SENSOR_GYRO_BATCHES_PER_SEC_HIGH,
sapConf.SENSOR_ALGORITHM_CONFIG_MASK); sapConf.SENSOR_ALGORITHM_CONFIG_MASK);
} )); } ));
} }
}; };
@ -1075,7 +1076,7 @@ GnssAdapter::gnssUpdateConfigCommand(GnssConfig config)
newGpsLock = GNSS_CONFIG_GPS_LOCK_MO; newGpsLock = GNSS_CONFIG_GPS_LOCK_MO;
} }
if (newGpsLock == ContextBase::mGps_conf.GPS_LOCK || if (newGpsLock == ContextBase::mGps_conf.GPS_LOCK ||
0 != mAdapter.getAfwControlId()) { 0 != mAdapter.getAfwControlId() || NULL != adapter.mNfwCb) {
gnssConfigNeedEngineUpdate.flags &= ~(GNSS_CONFIG_FLAGS_GPS_LOCK_VALID_BIT); gnssConfigNeedEngineUpdate.flags &= ~(GNSS_CONFIG_FLAGS_GPS_LOCK_VALID_BIT);
} }
ContextBase::mGps_conf.GPS_LOCK = newGpsLock; ContextBase::mGps_conf.GPS_LOCK = newGpsLock;