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