From 9e91ca82942a4b639d7079c5f573409e9fcd683b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beat=20K=C3=BCng?= Date: Mon, 9 May 2022 16:33:36 +0200 Subject: [PATCH] log_writer_file: protect access to _should_run, use px4::atomicbool for _exit_thread --- src/modules/logger/log_writer_file.cpp | 12 ++++++++---- src/modules/logger/log_writer_file.h | 5 +++-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/modules/logger/log_writer_file.cpp b/src/modules/logger/log_writer_file.cpp index b32d5ff0ae..e6453a8080 100644 --- a/src/modules/logger/log_writer_file.cpp +++ b/src/modules/logger/log_writer_file.cpp @@ -287,7 +287,9 @@ int LogWriterFile::hardfault_store_filename(const char *log_file) void LogWriterFile::stop_log(LogType type) { + lock(); _buffers[(int)type]._should_run = false; + unlock(); notify(); } @@ -312,8 +314,10 @@ int LogWriterFile::thread_start() void LogWriterFile::thread_stop() { // this will terminate the main loop of the writer thread - _exit_thread = true; + lock(); + _exit_thread.store(true); _buffers[0]._should_run = _buffers[1]._should_run = false; + unlock(); notify(); @@ -335,10 +339,10 @@ void *LogWriterFile::run_helper(void *context) void LogWriterFile::run() { - while (!_exit_thread) { + while (!_exit_thread.load()) { // Outer endless loop // Wait for _should_run flag - while (!_exit_thread) { + while (!_exit_thread.load()) { bool start = false; pthread_mutex_lock(&_mtx); pthread_cond_wait(&_cv, &_mtx); @@ -350,7 +354,7 @@ void LogWriterFile::run() } } - if (_exit_thread) { + if (_exit_thread.load()) { break; } diff --git a/src/modules/logger/log_writer_file.h b/src/modules/logger/log_writer_file.h index 01db3bdaaa..b6bfcdcf8b 100644 --- a/src/modules/logger/log_writer_file.h +++ b/src/modules/logger/log_writer_file.h @@ -34,6 +34,7 @@ #pragma once #include +#include #include #include #include @@ -205,8 +206,8 @@ private: LogFileBuffer _buffers[(int)LogType::Count]; - bool _exit_thread = false; - bool _need_reliable_transfer = false; + px4::atomic_bool _exit_thread{false}; + bool _need_reliable_transfer{false}; pthread_mutex_t _mtx; pthread_cond_t _cv; pthread_t _thread = 0;