From 58d904a328c0d849769b483e901a0be9426b8209 Mon Sep 17 00:00:00 2001
From: liuxiaolong <liuxiaolong@aiotlink.com>
Date: 星期二, 20 七月 2021 20:20:44 +0800
Subject: [PATCH] 调整Request C.BHFree的位置

---
 src/defs.cpp |   72 +++++++++++++++++++++++-------------
 1 files changed, 46 insertions(+), 26 deletions(-)

diff --git a/src/defs.cpp b/src/defs.cpp
index 9402b27..8305d66 100644
--- a/src/defs.cpp
+++ b/src/defs.cpp
@@ -123,6 +123,40 @@
 	return 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;
+
+	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;
+	}
+
+	for (auto &kv : store) {
+		if (kv.first == &shm) {
+			local_cache = kv;
+			return *local_cache.second;
+		}
+	}
+	auto &mq = GetCenterInfo(shm)->mq_sender_;
+	store.emplace_back(&shm, std::make_shared<ShmSocket>(mq.offset_, shm, mq.id_));
+	// store.emplace_back(&shm, new ShmSocket(mq.offset_, shm, mq.id_));
+	local_cache = store.back();
+	return *local_cache.second;
+}
 } // namespace
 
 CenterInfo *GetCenterInfo(SharedMemory &shm)
@@ -134,29 +168,7 @@
 	return nullptr;
 }
 
-ShmSocket &DefaultSender(SharedMemory &shm)
-{
-	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) {
-		return *local_cache.second;
-	}
-
-	std::lock_guard<std::mutex> lk(s_mtx);
-	for (auto &kv : store) {
-		if (kv.first == &shm) {
-			local_cache = kv;
-			return *local_cache.second;
-		}
-	}
-	auto &mq = GetCenterInfo(shm)->mq_sender_;
-	store.emplace_back(&shm, new ShmSocket(mq.offset_, shm, mq.id_));
-	local_cache = store.back();
-	return *local_cache.second;
-}
+ShmSocket &DefaultSender(SharedMemory &shm) { return ShmSender(shm, false); }
 
 BHomeMetaInfo *GetBHomeMeta()
 {
@@ -266,13 +278,21 @@
 std::string BHomeShmName()
 {
 	auto bhome_meta = Ptr<BHomeMetaInfo>(kShmMetaInfoFixedAddress + Addr(BHomeMetaShm().get_address()));
-	return "bhome_shmq_id_" + std::to_string(bhome_meta->shm_id_.load());
+	return "bhshmq_sid_" + std::to_string(bhome_meta->shm_id_.load());
 }
 
 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