From cf05ea3d9f43e4e84d621e1f9d54cbef552b6e2b Mon Sep 17 00:00:00 2001
From: lichao <lichao@aiotlink.com>
Date: 星期二, 18 五月 2021 16:53:28 +0800
Subject: [PATCH] fix center init mutex.

---
 src/bh_api.cpp |   55 ++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 52 insertions(+), 3 deletions(-)

diff --git a/src/bh_api.cpp b/src/bh_api.cpp
index 7e7b2e9..b37eaae 100644
--- a/src/bh_api.cpp
+++ b/src/bh_api.cpp
@@ -1,6 +1,7 @@
 #include "bh_api.h"
 #include "defs.h"
 #include "topic_node.h"
+#include <cstdio>
 #include <memory>
 
 using namespace bhome_shm;
@@ -8,11 +9,47 @@
 
 namespace
 {
+std::string GetProcExe()
+{
+	auto f = fopen("/proc/self/stat", "rb");
+	if (f) {
+		DEFER1(fclose(f));
+		char buf[100] = {0};
+		int n = fread(buf, 1, sizeof(buf), f);
+		if (n > 0) {
+			std::string s(buf, n);
+			auto start = s.find('(');
+			if (start != std::string::npos) {
+				++start;
+				auto end = s.find(')', start);
+				return s.substr(start, end - start);
+			}
+		}
+	}
+	return std::to_string(getpid());
+}
+std::unique_ptr<TopicNode> &ProcNodePtr()
+{
+	static std::mutex mtx;
+	std::lock_guard<std::mutex> lk(mtx);
+
+	static std::unique_ptr<TopicNode> ptr;
+	if (!ptr && GlobalInit(BHomeShm())) {
+		auto InitLog = []() {
+			auto id = GetProcExe();
+			char path[200] = {0};
+			sprintf(path, "/opt/vasystem/valog/bhshmq_node_%s.log", id.c_str());
+			ns_log::AddLog(path);
+			return true;
+		};
+		static bool init_log = InitLog();
+		ptr.reset(new TopicNode(BHomeShm()));
+	}
+	return ptr;
+}
 TopicNode &ProcNode()
 {
-	static bool init = GlobalInit(BHomeShm());
-	static TopicNode node(BHomeShm());
-	return node;
+	return *ProcNodePtr();
 }
 
 class TmpPtr : private boost::noncopyable
@@ -82,6 +119,12 @@
 		return false;
 	}
 	MsgOut msg_reply;
+	auto &ptr = ProcNodePtr();
+	if (!ptr) {
+		SetLastError(eNotFound, "center not started.");
+		return 0;
+	}
+
 	return (ProcNode().*mfunc)(input, msg_reply, timeout_ms) &&
 	       PackOutput(msg_reply, reply, reply_len);
 }
@@ -320,6 +363,12 @@
 	free(data);
 }
 
+int BHCleanup()
+{
+	ProcNodePtr().reset();
+	return 0;
+}
+
 int BHGetLastError(void **msg, int *msg_len)
 {
 	int ec = 0;

--
Gitblit v1.8.0