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:
parent
3b8395fe7b
commit
7490804ed9
1 changed files with 80 additions and 79 deletions
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue