From 69f60d8bcc5121eb952b57277c94ad5cecb8d44a Mon Sep 17 00:00:00 2001
From: lichao <lichao@aiotlink.com>
Date: 星期四, 03 六月 2021 11:03:08 +0800
Subject: [PATCH] client side update shm on center restart.

---
 src/defs.cpp |   53 ++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 36 insertions(+), 17 deletions(-)

diff --git a/src/defs.cpp b/src/defs.cpp
index 9402b27..22b43e4 100644
--- a/src/defs.cpp
+++ b/src/defs.cpp
@@ -123,29 +123,28 @@
 	return shm;
 }
 
-} // namespace
-
-CenterInfo *GetCenterInfo(SharedMemory &shm)
-{
-	auto pmeta = Ptr<CenterMetaInfo>(kCenterInfoFixedAddress + Addr(shm.get_address()));
-	if (pmeta->tag_ == kMetaInfoTag) {
-		return &pmeta->info_;
-	}
-	return nullptr;
-}
-
-ShmSocket &DefaultSender(SharedMemory &shm)
+ShmSocket &ShmSender(SharedMemory &shm, const bool reset)
 {
 	typedef std::pair<void *, std::shared_ptr<ShmSocket>> Pair;
 	static std::vector<Pair> store;
 	static std::mutex s_mtx;
-
 	thread_local Pair local_cache;
-	if (local_cache.first == &shm) {
+
+	std::lock_guard<std::mutex> lk(s_mtx);
+
+	if (reset) {
+		for (auto &kv : store) {
+			if (kv.first == &shm) {
+				auto &mq = GetCenterInfo(shm)->mq_sender_;
+				kv.second.reset(new ShmSocket(mq.offset_, shm, mq.id_));
+				local_cache = kv;
+				return *local_cache.second;
+			}
+		}
+	} else if (local_cache.first == &shm) {
 		return *local_cache.second;
 	}
 
-	std::lock_guard<std::mutex> lk(s_mtx);
 	for (auto &kv : store) {
 		if (kv.first == &shm) {
 			local_cache = kv;
@@ -157,6 +156,18 @@
 	local_cache = store.back();
 	return *local_cache.second;
 }
+} // namespace
+
+CenterInfo *GetCenterInfo(SharedMemory &shm)
+{
+	auto pmeta = Ptr<CenterMetaInfo>(kCenterInfoFixedAddress + Addr(shm.get_address()));
+	if (pmeta->tag_ == kMetaInfoTag) {
+		return &pmeta->info_;
+	}
+	return nullptr;
+}
+
+ShmSocket &DefaultSender(SharedMemory &shm) { return ShmSender(shm, false); }
 
 BHomeMetaInfo *GetBHomeMeta()
 {
@@ -271,8 +282,16 @@
 
 SharedMemory &BHomeShm()
 {
-	static SharedMemory shm(BHomeShmName(), 1024 * 1024 * 512);
-	return shm;
+	static std::unique_ptr<SharedMemory> shm_ptr;
+	static std::string shm_name;
+	if (!shm_ptr || shm_name != BHomeShmName()) {
+		shm_name = BHomeShmName();
+		if (shm_ptr) {
+			ShmSender(*shm_ptr, true); // reset sender.
+		}
+		shm_ptr.reset(new SharedMemory(shm_name, 1024 * 1024 * 512));
+	}
+	return *shm_ptr;
 }
 
 bool GlobalInit(SharedMemory &shm) { return GetCenterInfo(shm); }

--
Gitblit v1.8.0