From c6964d5af25d4ec7ed9dbe7674dc4e3896b36ead Mon Sep 17 00:00:00 2001
From: lichao <lichao@aiotlink.com>
Date: 星期五, 16 四月 2021 16:10:02 +0800
Subject: [PATCH] node remove mq if never registered; refactor.

---
 src/bh_util.h |   99 +++++++++++++++++++++++++++++++++++--------------
 1 files changed, 71 insertions(+), 28 deletions(-)

diff --git a/src/bh_util.h b/src/bh_util.h
index d86b931..bc48578 100644
--- a/src/bh_util.h
+++ b/src/bh_util.h
@@ -19,11 +19,12 @@
 #define BH_UTIL_SOXWOK67
 
 #include <functional>
+#include <mutex>
 #include <stdint.h>
 
 inline uint16_t Get8(const void *p)
 {
-	return static_cast<const uint8_t*>(p)[0];
+	return static_cast<const uint8_t *>(p)[0];
 }
 inline void Put8(void *p, uint8_t u)
 {
@@ -32,9 +33,9 @@
 
 inline uint16_t Get16(const void *p)
 {
-	auto ptr = static_cast<const uint8_t*>(p);
-	return (((uint16_t)ptr[0]) << 8u) |
-		   (((uint16_t)ptr[1]));
+	auto ptr = static_cast<const uint8_t *>(p);
+	return (((uint16_t) ptr[0]) << 8u) |
+	       (((uint16_t) ptr[1]));
 }
 inline void Put16(void *p, uint16_t u)
 {
@@ -45,11 +46,11 @@
 
 inline uint32_t Get32(const void *p)
 {
-	auto ptr = static_cast<const uint8_t*>(p);
-	return (((uint32_t)ptr[0]) << 24u) |
-		   (((uint32_t)ptr[1]) << 16u) |
-		   (((uint32_t)ptr[2]) << 8u) |
-		   (((uint32_t)ptr[3]));
+	auto ptr = static_cast<const uint8_t *>(p);
+	return (((uint32_t) ptr[0]) << 24u) |
+	       (((uint32_t) ptr[1]) << 16u) |
+	       (((uint32_t) ptr[2]) << 8u) |
+	       (((uint32_t) ptr[3]));
 }
 inline void Put32(void *p, uint32_t u)
 {
@@ -60,17 +61,17 @@
 	ptr[3] = (uint8_t)(u);
 }
 
-inline uint64_t Get64(const void *p)                             
+inline uint64_t Get64(const void *p)
 {
-	auto ptr = static_cast<const uint8_t*>(p);
-	return (((uint64_t)ptr[0]) << 56u) |
-		   (((uint64_t)ptr[1]) << 48u) |
-		   (((uint64_t)ptr[2]) << 40u) |
-		   (((uint64_t)ptr[3]) << 32u) |
-		   (((uint64_t)ptr[4]) << 24u) |
-		   (((uint64_t)ptr[5]) << 16u) |
-		   (((uint64_t)ptr[6]) << 8u) |
-		   ((uint64_t)ptr[7]);
+	auto ptr = static_cast<const uint8_t *>(p);
+	return (((uint64_t) ptr[0]) << 56u) |
+	       (((uint64_t) ptr[1]) << 48u) |
+	       (((uint64_t) ptr[2]) << 40u) |
+	       (((uint64_t) ptr[3]) << 32u) |
+	       (((uint64_t) ptr[4]) << 24u) |
+	       (((uint64_t) ptr[5]) << 16u) |
+	       (((uint64_t) ptr[6]) << 8u) |
+	       ((uint64_t) ptr[7]);
 }
 inline void Put64(void *p, uint64_t u)
 {
@@ -92,20 +93,62 @@
 
 class ExitCall
 {
-    typedef std::function<void(void)> func_t;
-    func_t m_func;
+	typedef std::function<void(void)> func_t;
+	func_t m_func;
+
 public:
-    explicit ExitCall(func_t f): m_func(f) {}
-    ~ExitCall() { if (m_func) { m_func(); } }
+	explicit ExitCall(func_t f) :
+	    m_func(f) {}
+	~ExitCall()
+	{
+		if (m_func) { m_func(); }
+	}
+};
+
+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)
+#define JOIN_IMPL(a, b) a##b
+#define JOIN(a, b) JOIN_IMPL(a, b)
 // defer function / lambda.
-#define DEFERF(func) ExitCall JOIN(defer_ , __LINE__)(func)
+#define DEFERF(func) ExitCall JOIN(defer_, __LINE__)(func)
 // defer simple expression
-#define DEFER1(expr) DEFERF([&](){ expr; })
-
+#define DEFER1(expr) DEFERF([&]() { expr; })
 
 #endif /* end of include guard: BH_UTIL_SOXWOK67 */

--
Gitblit v1.8.0