lichao
2021-05-18 ccf72bb0b8aa9c421bb2964acca2dcd868d10a94
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, "/tmp/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_bind_msg_shm = MsgI::BindShm(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;