From dc12826dd61ce18fac3a9561c5843d30a0cf9660 Mon Sep 17 00:00:00 2001 From: lichao <lichao@aiotlink.com> Date: 星期五, 02 四月 2021 15:48:53 +0800 Subject: [PATCH] add request topic cache; refactor req/rep center. --- src/bh_util.h | 39 +++++++++++++++++++++++++++++++++++++++ 1 files changed, 39 insertions(+), 0 deletions(-) diff --git a/src/bh_util.h b/src/bh_util.h index b5dc45e..bc48578 100644 --- a/src/bh_util.h +++ b/src/bh_util.h @@ -19,6 +19,7 @@ #define BH_UTIL_SOXWOK67 #include <functional> +#include <mutex> #include <stdint.h> inline uint16_t Get8(const void *p) @@ -104,6 +105,44 @@ } }; +template <class D, class M, class G = std::unique_lock<M>> +class SyncedPtr +{ + G lock_; + D *p_ = nullptr; + +public: + SyncedPtr(M &mtx, D &data) : + lock_(mtx), p_(&data) {} + SyncedPtr(SyncedPtr &&a) + { + lock_.swap(a.lock_); + std::swap(p_, a.p_); + } + D *operator->() const { return p_; } + D &operator*() const { return *p_; } +}; + +template <class T, class Mutex = std::mutex, class Lock = std::unique_lock<Mutex>> +class Synced +{ + typedef T Data; + Mutex mutex_; + Data data_; + typedef SyncedPtr<Data, Mutex, Lock> Ptr; + +public: + template <class... P> + explicit Synced(const P &...p) : + data_(p...) {} + Ptr operator->() { return Ptr(mutex_, data_); } + auto Apply(const auto &f) + { + Lock lk(mutex_); + return f(data_); + } +}; + // macro helper #define JOIN_IMPL(a, b) a##b #define JOIN(a, b) JOIN_IMPL(a, b) -- Gitblit v1.8.0