From fbb73098976daba67d19859e17bdcd4591d13187 Mon Sep 17 00:00:00 2001 From: Markus Gans Date: Sat, 14 Oct 2023 19:27:51 +0200 Subject: [PATCH] Switch to a readers-writer lock for the timer list --- ChangeLog | 3 +++ examples/xpmimage.h | 2 +- final/ftimer.cpp | 2 +- final/ftimer.h | 16 ++++++++-------- final/output/tty/fterm.h | 15 ++++++++------- 5 files changed, 21 insertions(+), 17 deletions(-) diff --git a/ChangeLog b/ChangeLog index 88c51387..46742b95 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,6 @@ +2023-10-14 Markus Gans + * Switch to a readers-writer lock for the timer list + 2023-10-07 Markus Gans * Bugfix: Bottom transparent shadow changes were registered in wrong row diff --git a/examples/xpmimage.h b/examples/xpmimage.h index 9140b91d..02a63b03 100644 --- a/examples/xpmimage.h +++ b/examples/xpmimage.h @@ -1124,7 +1124,7 @@ void XpmImage::parseXPM3 (XPMdataT& raw_xpm) { std::vector xpm{}; xpm.reserve(getArraySize(xpm)); - std::copy (raw_xpm.begin(), raw_xpm.end(), std::back_inserter(xpm)); + std::copy (std::begin(raw_xpm), std::end(raw_xpm), std::back_inserter(xpm)); parseXPM3 (xpm); } diff --git a/final/ftimer.cpp b/final/ftimer.cpp index 5a317a9c..971ab01e 100644 --- a/final/ftimer.cpp +++ b/final/ftimer.cpp @@ -37,7 +37,7 @@ static auto getInstance() -> FTimer* return fobject_timer.get(); } -std::mutex timer_var::mutex{}; +std::shared_timed_mutex timer_var::mutex{}; } // namespace internal diff --git a/final/ftimer.h b/final/ftimer.h index 0638822e..d2098ab0 100644 --- a/final/ftimer.h +++ b/final/ftimer.h @@ -39,7 +39,7 @@ #include #include #include -#include +#include #include #include "final/fevent.h" @@ -53,7 +53,7 @@ namespace internal struct timer_var { - static std::mutex mutex; + static std::shared_timed_mutex mutex; }; } // namespace internal @@ -158,7 +158,7 @@ auto FTimer::addTimer (ObjectT* object, int interval) & -> int // Create a timer and returns the timer identifier number // (interval in ms) - std::lock_guard lock_guard(internal::timer_var::mutex); + std::lock_guard lock_guard(internal::timer_var::mutex); auto& timer_list = globalTimerList(); int id = getNextId(); const auto time_interval = milliseconds(interval); @@ -187,7 +187,7 @@ auto FTimer::delTimer (int id) const & -> bool if ( id <= 0 ) return false; - std::lock_guard lock_guard(internal::timer_var::mutex); + std::lock_guard lock_guard(internal::timer_var::mutex); auto& timer_list = globalTimerList(); if ( ! timer_list || timer_list->empty() ) @@ -214,7 +214,7 @@ auto FTimer::delOwnTimers(const ObjectT* object) const & -> bool { // Deletes all timers of this object - std::lock_guard lock_guard(internal::timer_var::mutex); + std::lock_guard lock_guard(internal::timer_var::mutex); auto& timer_list = globalTimerList(); if ( ! timer_list || timer_list->empty() ) @@ -237,7 +237,7 @@ auto FTimer::delAllTimers() const & -> bool { // Deletes all timers of all objects - std::lock_guard lock_guard(internal::timer_var::mutex); + std::lock_guard lock_guard(internal::timer_var::mutex); auto& timer_list = globalTimerList(); if ( ! timer_list || timer_list->empty() ) @@ -255,8 +255,8 @@ template auto FTimer::processTimerEvent (CallbackT callback) -> uInt { uInt activated{0}; - std::unique_lock lock ( internal::timer_var::mutex - , std::defer_lock ); + std::shared_lock lock ( internal::timer_var::mutex + , std::defer_lock ); if ( ! lock.try_lock() ) return 0; diff --git a/final/output/tty/fterm.h b/final/output/tty/fterm.h index 1db386ae..7b636e41 100644 --- a/final/output/tty/fterm.h +++ b/final/output/tty/fterm.h @@ -229,8 +229,8 @@ class FTerm final static auto scrollTermForward() -> bool; static auto scrollTermReverse() -> bool; - template - static void paddingPrintf (const std::string&, Args&&...); + template + static void paddingPrintf (StringT&&, Args&&...); static void paddingPrint (const std::string&, int = 1); static void stringPrint (const std::string&); @@ -315,10 +315,10 @@ inline void FTerm::unsetUTF8() { setUTF8(false); } //---------------------------------------------------------------------- -template -inline void FTerm::paddingPrintf (const std::string& format, Args&&... args) +template +inline void FTerm::paddingPrintf (StringT&& format, Args&&... args) { - const int size = std::snprintf (nullptr, 0, format.data(), args...); + const int size = std::snprintf (nullptr, 0, format, args...); if ( size <= 0 ) return; @@ -326,8 +326,9 @@ inline void FTerm::paddingPrintf (const std::string& format, Args&&... args) std::string buffer{}; auto buffer_size = std::size_t(size + 1); buffer.resize(buffer_size); - std::snprintf ( const_cast(buffer.data()), buffer_size - , format.data(), std::forward(args)... ); + std::snprintf ( &*buffer.begin(), buffer_size + , std::forward(format) + , std::forward(args)... ); buffer_size--; buffer.resize(buffer_size); paddingPrint (buffer, 1);