summaryrefslogtreecommitdiff
path: root/src/util.hpp
diff options
context:
space:
mode:
authorDan Goodliffe <dan.goodliffe@octal.co.uk>2026-05-19 12:12:28 +0100
committerDan Goodliffe <dan.goodliffe@octal.co.uk>2026-05-19 12:12:28 +0100
commita3d868ca57591a6d977da8a7e9ec5c14976e73ec (patch)
tree803085077c0a4ad148359738b985e117dff75c42 /src/util.hpp
parent29f458117184af5b1507cac01b48b41bfbad568a (diff)
parentcabd894779c2d2e453c8ed7771fdbd17c881bc2c (diff)
downloadwebstat-a3d868ca57591a6d977da8a7e9ec5c14976e73ec.tar.bz2
webstat-a3d868ca57591a6d977da8a7e9ec5c14976e73ec.tar.xz
webstat-a3d868ca57591a6d977da8a7e9ec5c14976e73ec.zip
Merge remote-tracking branch 'origin/retry-store'
Diffstat (limited to 'src/util.hpp')
-rw-r--r--src/util.hpp49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/util.hpp b/src/util.hpp
index f7254e8..5cac5a3 100644
--- a/src/util.hpp
+++ b/src/util.hpp
@@ -3,6 +3,7 @@
#include <chrono>
#include <command.h>
#include <scn/scan.h>
+#include <shared_mutex>
#include <tuple>
namespace WebStat {
@@ -95,4 +96,52 @@ namespace WebStat {
}
return false;
}
+
+ template<typename ValueType, typename MutexType = std::shared_mutex> class ThreadSafeT {
+ public:
+ template<typename... P> ThreadSafeT(P &&... params) : value {std::forward<P>(params)...} { }
+
+ template<typename LockedValueType, typename LockType> class Locked {
+ public:
+ Locked(LockedValueType & valueRef, MutexType & mutex) : value {valueRef}, lock {mutex} { }
+
+ LockedValueType *
+ operator->()
+ {
+ return &value;
+ }
+
+ private:
+ LockedValueType & value;
+ LockType lock;
+ };
+
+ Locked<const ValueType, std::shared_lock<MutexType>>
+ shared() const
+ {
+ return {value, mutex};
+ }
+
+ Locked<ValueType, std::lock_guard<MutexType>>
+ unique()
+ {
+ return {value, mutex};
+ }
+
+ Locked<const ValueType, std::shared_lock<MutexType>>
+ operator->() const
+ {
+ return shared();
+ }
+
+ Locked<ValueType, std::lock_guard<MutexType>>
+ operator()()
+ {
+ return unique();
+ }
+
+ private:
+ ValueType value;
+ mutable MutexType mutex;
+ };
}