From 6ae8b3c6bc7037587abd48c21fb833508d6e7b6f Mon Sep 17 00:00:00 2001 From: KerstinKeller Date: Wed, 24 Jan 2024 16:34:24 +0100 Subject: [PATCH] [Core] Fix: proper destructors / rule of 5 for everything involving std::thread (#1334) --- ecal/core/include/ecal/ecal_timed_cb.h | 5 ++++- ecal/core/src/ecal_thread.h | 5 +++++ ecal/core/src/ecal_timer.cpp | 4 ++++ ecal/core/src/io/ecal_memfile_pool.cpp | 5 ++++- ecal/core/src/io/ecal_memfile_pool.h | 5 +++++ 5 files changed, 22 insertions(+), 2 deletions(-) diff --git a/ecal/core/include/ecal/ecal_timed_cb.h b/ecal/core/include/ecal/ecal_timed_cb.h index 5581b6d518..a8cceb00f9 100644 --- a/ecal/core/include/ecal/ecal_timed_cb.h +++ b/ecal/core/include/ecal/ecal_timed_cb.h @@ -97,7 +97,10 @@ namespace eCAL { if (!m_running) return(false); m_stop = true; - m_thread.join(); + // Wait for the callback thread to finish + if (m_thread.joinable()) { + m_thread.join(); + } m_running = false; return(true); } diff --git a/ecal/core/src/ecal_thread.h b/ecal/core/src/ecal_thread.h index 7c5fa3c65f..135a4b1a1d 100644 --- a/ecal/core/src/ecal_thread.h +++ b/ecal/core/src/ecal_thread.h @@ -37,6 +37,11 @@ namespace eCAL CThread(); virtual ~CThread(); + CThread(const CThread&) = delete; + CThread& operator=(const CThread&) = delete; + CThread(CThread&& rhs) = delete; + CThread& operator=(CThread&& rhs) = delete; + int Start(int period, std::function ext_caller_); int Stop(); int Fire(); diff --git a/ecal/core/src/ecal_timer.cpp b/ecal/core/src/ecal_timer.cpp index 1d1d22434a..8ffefd46a3 100644 --- a/ecal/core/src/ecal_timer.cpp +++ b/ecal/core/src/ecal_timer.cpp @@ -38,6 +38,10 @@ namespace eCAL CTimerImpl(const int timeout_, TimerCallbackT callback_, const int delay_) : m_stop(false), m_running(false) { Start(timeout_, callback_, delay_); } virtual ~CTimerImpl() { Stop(); } + CTimerImpl(const CTimerImpl&) = delete; + CTimerImpl& operator=(const CTimerImpl&) = delete; + CTimerImpl(CTimerImpl&& rhs) = delete; + CTimerImpl& operator=(CTimerImpl&& rhs) = delete; bool Start(const int timeout_, TimerCallbackT callback_, const int delay_) { diff --git a/ecal/core/src/io/ecal_memfile_pool.cpp b/ecal/core/src/io/ecal_memfile_pool.cpp index 091e2b95be..eb92d03668 100644 --- a/ecal/core/src/io/ecal_memfile_pool.cpp +++ b/ecal/core/src/io/ecal_memfile_pool.cpp @@ -304,7 +304,10 @@ namespace eCAL { } - CMemFileThreadPool::~CMemFileThreadPool() = default; + CMemFileThreadPool::~CMemFileThreadPool() + { + Destroy(); + } void CMemFileThreadPool::Create() { diff --git a/ecal/core/src/io/ecal_memfile_pool.h b/ecal/core/src/io/ecal_memfile_pool.h index e60b34f874..74b9202a1b 100644 --- a/ecal/core/src/io/ecal_memfile_pool.h +++ b/ecal/core/src/io/ecal_memfile_pool.h @@ -49,6 +49,11 @@ namespace eCAL CMemFileObserver(); ~CMemFileObserver(); + CMemFileObserver(const CMemFileObserver&) = delete; + CMemFileObserver& operator=(const CMemFileObserver&) = delete; + CMemFileObserver(CMemFileObserver&& rhs) = delete; + CMemFileObserver& operator=(CMemFileObserver&& rhs) = delete; + bool Create(const std::string& memfile_name_, const std::string& memfile_event_); bool Destroy();