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