From e76e7e034d2b42d5819b7b184cd7034ff51ebb26 Mon Sep 17 00:00:00 2001 From: Mikaƫl Capelle Date: Wed, 18 Nov 2020 19:22:13 +0100 Subject: Move MemoizedLock to uibase. --- src/modinfowithconflictinfo.h | 8 ++++---- src/thread_utils.h | 45 ------------------------------------------- 2 files changed, 4 insertions(+), 49 deletions(-) (limited to 'src') diff --git a/src/modinfowithconflictinfo.h b/src/modinfowithconflictinfo.h index feded99b..e312a89a 100644 --- a/src/modinfowithconflictinfo.h +++ b/src/modinfowithconflictinfo.h @@ -3,7 +3,7 @@ #include -#include "thread_utils.h" +#include "memoizedlock.h" #include "modinfo.h" #include @@ -145,9 +145,9 @@ protected: private: - MOShared::MemoizedLocked> m_FileTree; - MOShared::MemoizedLocked m_Valid; - MOShared::MemoizedLocked> m_Contents; + MOBase::MemoizedLocked> m_FileTree; + MOBase::MemoizedLocked m_Valid; + MOBase::MemoizedLocked> m_Contents; MOShared::DirectoryEntry **m_DirectoryStructure; diff --git a/src/thread_utils.h b/src/thread_utils.h index f64dd601..e816a4e2 100644 --- a/src/thread_utils.h +++ b/src/thread_utils.h @@ -24,51 +24,6 @@ std::thread startSafeThread(F&& f) }); } - -/** - * Class that can be used to perform thread-safe memoization. - * - * Each instance hold a flag indicating if the current value is up-to-date - * or not. This flag can be reset using `invalidate()`. When the value is queried, - * the flag is checked, and if it is not up-to-date, the given callback is used - * to compute the value. - * - * The computation and update of the value is locked to avoid concurrent modifications. - * - * @tparam T Type of value ot memoized. - * @tparam Fn Type of the callback. - */ -template > -struct MemoizedLocked { - - template - MemoizedLocked(Callable &&callable, T value = {}) : - m_Fn{ std::forward(callable) }, m_Value{ std::move(value) } { } - - template - T& value(Args&&... args) const { - if (m_NeedUpdating) { - std::scoped_lock lock(m_Mutex); - if (m_NeedUpdating) { - m_Value = std::invoke(m_Fn, std::forward(args)... ); - m_NeedUpdating = false; - } - } - return m_Value; - } - - void invalidate() { - m_NeedUpdating = true; - } - -private: - mutable std::mutex m_Mutex; - mutable std::atomic m_NeedUpdating{ true }; - - Fn m_Fn; - mutable T m_Value; -}; - /** * @brief Apply the given callable to each element between the two given iterators * in a parallel way. -- cgit v1.3.1