From 3fef401e811e9df8931d4aa51259a1259f997ee6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beat=20K=C3=BCng?= Date: Mon, 9 Mar 2020 12:07:36 +0100 Subject: [PATCH] uorb callbacks: fix unregister ordering to avoid race conditions The order should be: first unregister, then remove the item from the runnable queue. --- src/lib/mixer_module/mixer_module.cpp | 2 +- .../sensors/vehicle_acceleration/VehicleAcceleration.cpp | 4 ++-- .../vehicle_angular_velocity/VehicleAngularVelocity.cpp | 4 ++-- src/modules/sensors/vehicle_imu/VehicleIMU.cpp | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/lib/mixer_module/mixer_module.cpp b/src/lib/mixer_module/mixer_module.cpp index 8b2cdf3bd0..f3523092a4 100644 --- a/src/lib/mixer_module/mixer_module.cpp +++ b/src/lib/mixer_module/mixer_module.cpp @@ -126,8 +126,8 @@ bool MixingOutput::updateSubscriptions(bool allow_wq_switch) if (_scheduling_policy == SchedulingPolicy::Auto) { // first clear everything - _interface.ScheduleClear(); unregister(); + _interface.ScheduleClear(); // if subscribed to control group 0 or 1 then move to the rate_ctrl WQ const bool sub_group_0 = (_groups_required & (1 << 0)); diff --git a/src/modules/sensors/vehicle_acceleration/VehicleAcceleration.cpp b/src/modules/sensors/vehicle_acceleration/VehicleAcceleration.cpp index 3911823944..389783f5c3 100644 --- a/src/modules/sensors/vehicle_acceleration/VehicleAcceleration.cpp +++ b/src/modules/sensors/vehicle_acceleration/VehicleAcceleration.cpp @@ -71,14 +71,14 @@ bool VehicleAcceleration::Start() void VehicleAcceleration::Stop() { - Deinit(); - // clear all registered callbacks for (auto &sub : _sensor_sub) { sub.unregisterCallback(); } _sensor_selection_sub.unregisterCallback(); + + Deinit(); } void VehicleAcceleration::CheckFilters() diff --git a/src/modules/sensors/vehicle_angular_velocity/VehicleAngularVelocity.cpp b/src/modules/sensors/vehicle_angular_velocity/VehicleAngularVelocity.cpp index f84cf6d8b6..d3ab17aedb 100644 --- a/src/modules/sensors/vehicle_angular_velocity/VehicleAngularVelocity.cpp +++ b/src/modules/sensors/vehicle_angular_velocity/VehicleAngularVelocity.cpp @@ -74,14 +74,14 @@ bool VehicleAngularVelocity::Start() void VehicleAngularVelocity::Stop() { - Deinit(); - // clear all registered callbacks for (auto &sub : _sensor_sub) { sub.unregisterCallback(); } _sensor_selection_sub.unregisterCallback(); + + Deinit(); } void VehicleAngularVelocity::CheckFilters() diff --git a/src/modules/sensors/vehicle_imu/VehicleIMU.cpp b/src/modules/sensors/vehicle_imu/VehicleIMU.cpp index ddad06390f..983896d1fe 100644 --- a/src/modules/sensors/vehicle_imu/VehicleIMU.cpp +++ b/src/modules/sensors/vehicle_imu/VehicleIMU.cpp @@ -66,11 +66,11 @@ bool VehicleIMU::Start() void VehicleIMU::Stop() { - Deinit(); - // clear all registered callbacks _sensor_accel_integrated_sub.unregisterCallback(); _sensor_gyro_integrated_sub.unregisterCallback(); + + Deinit(); } void VehicleIMU::ParametersUpdate(bool force)