From dde96dd4d7915246cfc6c67e07b1c4f09b31947f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beat=20K=C3=BCng?= Date: Fri, 6 May 2016 13:12:50 +0200 Subject: [PATCH] logger: allocate _vehicle_status_sub & _parameter_update_sub on the logger thread This makes sure the file descriptors are closed in the right thread. Before on NuttX, when stopping the logger, orb unsubscribe failed due to this. --- src/modules/logger/logger.cpp | 34 +++++++++++++++++++++++++--------- src/modules/logger/logger.h | 4 ++-- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/src/modules/logger/logger.cpp b/src/modules/logger/logger.cpp index 558271f2fe..c7ee20a138 100644 --- a/src/modules/logger/logger.cpp +++ b/src/modules/logger/logger.cpp @@ -385,18 +385,31 @@ void Logger::run() struct mallinfo alloc_info = {}; #endif /* DBGPRINT */ - PX4_WARN("logger started"); + PX4_INFO("logger started"); int mkdir_ret = mkdir(LOG_ROOT, S_IRWXU | S_IRWXG | S_IRWXO); if (mkdir_ret == 0) { - PX4_WARN("log root dir created: %s", LOG_ROOT); + PX4_INFO("log root dir created: %s", LOG_ROOT); } else if (errno != EEXIST) { - PX4_WARN("failed creating log root dir: %s", LOG_ROOT); + PX4_ERR("failed creating log root dir: %s", LOG_ROOT); return; } + if (!(_vehicle_status_sub = new uORB::Subscription(ORB_ID(vehicle_status)))) { + PX4_ERR("Failed to allocate subscription"); + return; + } + + if (!(_parameter_update_sub = new uORB::Subscription(ORB_ID(parameter_update)))) { + delete _vehicle_status_sub; + _vehicle_status_sub = nullptr; + PX4_ERR("Failed to allocate subscription"); + return; + } + + add_topic("sensor_gyro", 0); add_topic("sensor_accel", 0); add_topic("vehicle_rates_setpoint", 10); @@ -448,10 +461,10 @@ void Logger::run() while (!_task_should_exit) { // Start/stop logging when system arm/disarm - if (_vehicle_status_sub.check_updated()) { - _vehicle_status_sub.update(); - bool armed = (_vehicle_status_sub.get().arming_state == vehicle_status_s::ARMING_STATE_ARMED) || - (_vehicle_status_sub.get().arming_state == vehicle_status_s::ARMING_STATE_ARMED_ERROR); + if (_vehicle_status_sub->check_updated()) { + _vehicle_status_sub->update(); + bool armed = (_vehicle_status_sub->get().arming_state == vehicle_status_s::ARMING_STATE_ARMED) || + (_vehicle_status_sub->get().arming_state == vehicle_status_s::ARMING_STATE_ARMED_ERROR); if (_enabled != armed && !_log_on_start) { if (armed) { @@ -474,9 +487,9 @@ void Logger::run() /* Check if parameters have changed */ // this needs to change to a timestamped record to record a history of parameter changes - if (_parameter_update_sub.check_updated()) { + if (_parameter_update_sub->check_updated()) { warnx("parameter update"); - _parameter_update_sub.update(); + _parameter_update_sub->update(); write_changed_parameters(); } @@ -577,6 +590,9 @@ void Logger::run() usleep(_log_interval); } + delete _vehicle_status_sub; + delete _parameter_update_sub; + // stop the writer thread _writer.thread_stop(); diff --git a/src/modules/logger/logger.h b/src/modules/logger/logger.h index f37ea4401d..0fc557a715 100644 --- a/src/modules/logger/logger.h +++ b/src/modules/logger/logger.h @@ -95,8 +95,8 @@ private: bool _task_should_exit = true; char _log_dir[64]; - uORB::Subscription _vehicle_status_sub {ORB_ID(vehicle_status)}; - uORB::Subscription _parameter_update_sub {ORB_ID(parameter_update)}; + uORB::Subscription *_vehicle_status_sub = nullptr; + uORB::Subscription *_parameter_update_sub = nullptr; bool _enabled = false; // statistics