From 015ba62727b9a364b152b7d4a4f02f433791d66f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beat=20K=C3=BCng?= Date: Fri, 17 Feb 2023 09:47:54 +0100 Subject: [PATCH] log_writer_file: do not call close() with mutex held Generally not an issue, but if close() takes long, or even busy-loops due to an underlying bug in the OS, it will block the main thread too. --- src/modules/logger/log_writer_file.cpp | 20 ++++++++++++++++---- src/modules/logger/log_writer_file.h | 2 ++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/modules/logger/log_writer_file.cpp b/src/modules/logger/log_writer_file.cpp index f9f08fddb6..1ef9af4462 100644 --- a/src/modules/logger/log_writer_file.cpp +++ b/src/modules/logger/log_writer_file.cpp @@ -443,13 +443,19 @@ void LogWriterFile::run() if (!buffer._should_run && written == static_cast(available) && !is_part) { /* Stop only when all data written */ + pthread_mutex_unlock(&_mtx); buffer.close_file(); + pthread_mutex_lock(&_mtx); + buffer.reset(); } } else { PX4_ERR("write failed (%i)", errno); buffer._should_run = false; + pthread_mutex_unlock(&_mtx); buffer.close_file(); + pthread_mutex_lock(&_mtx); + buffer.reset(); } } else if (call_fsync && buffer._should_run) { @@ -458,7 +464,10 @@ void LogWriterFile::run() pthread_mutex_lock(&_mtx); } else if (available == 0 && !buffer._should_run) { + pthread_mutex_unlock(&_mtx); buffer.close_file(); + pthread_mutex_lock(&_mtx); + buffer.reset(); } /* if split into 2 parts, write the second part immediately as well */ @@ -687,12 +696,8 @@ ssize_t LogWriterFile::LogFileBuffer::write_to_file(const void *buffer, size_t s void LogWriterFile::LogFileBuffer::close_file() { - _head = 0; - _count = 0; - if (_fd >= 0) { int res = close(_fd); - _fd = -1; if (res) { PX4_WARN("closing log file failed (%i)", errno); @@ -703,5 +708,12 @@ void LogWriterFile::LogFileBuffer::close_file() } } +void LogWriterFile::LogFileBuffer::reset() +{ + _head = 0; + _count = 0; + _fd = -1; +} + } } diff --git a/src/modules/logger/log_writer_file.h b/src/modules/logger/log_writer_file.h index b6bfcdcf8b..f103a4eb50 100644 --- a/src/modules/logger/log_writer_file.h +++ b/src/modules/logger/log_writer_file.h @@ -171,6 +171,8 @@ private: void close_file(); + void reset(); + size_t get_read_ptr(void **ptr, bool *is_part); /**