zhangmeng
2021-07-02 056f71f24cefaf88f2a93714c6678c03ed5f1e0e
box/center_main.cc
@@ -19,36 +19,49 @@
#include "box.h"
#include "center.h"
#include "defs.h"
#include "log.h"
#include "signalhandle.h"
#include <boost/interprocess/sync/named_mutex.hpp>
#include <chrono>
#include <thread>
using namespace std::chrono_literals;
using namespace bhome_shm;
int center_main(int argc, const char *argv[])
{
   AppArg args(argc, argv);
   if (args.Has("remove")) {
      BHomeShm().Remove();
      return 0;
   ns_log::AddLog(BHLogDir() + "bhshmq_center.log");
   auto lvl = args.Get("log", "info");
   if (strcasecmp(lvl.c_str(), "trace") == 0) { ns_log::ResetLogLevel(ns_log::LogLevel::trace); }
   if (strcasecmp(lvl.c_str(), "debug") == 0) { ns_log::ResetLogLevel(ns_log::LogLevel::debug); }
   if (strcasecmp(lvl.c_str(), "info") == 0) { ns_log::ResetLogLevel(ns_log::LogLevel::info); }
   if (strcasecmp(lvl.c_str(), "warning") == 0) { ns_log::ResetLogLevel(ns_log::LogLevel::warning); }
   if (strcasecmp(lvl.c_str(), "error") == 0) { ns_log::ResetLogLevel(ns_log::LogLevel::error); }
   if (strcasecmp(lvl.c_str(), "fatal") == 0) { ns_log::ResetLogLevel(ns_log::LogLevel::fatal); }
   if (!CenterInit()) {
      auto msg = "init memory failed, or center is already running.";
      LOG_FATAL() << msg;
      printf("%s\n", msg);
      exit(0);
   }
   auto &shm = BHomeShm();
   GlobalInit(shm);
   if (args.Has("daemon") || args.Has("d")) {
      int r = daemon(0, 0); // maybe add center control msg to close itself.
   }
   bool run = true;
   auto showStatus = [&]() {
      auto init = BHomeShm().get_free_memory();
      uint64_t idx = 0;
      while (run) {
         std::this_thread::sleep_for(1s);
         printf("%8d shared memory: avail : %ld / %ld\n", ++idx, BHomeShm().get_free_memory(), init);
      }
   };
   std::thread t(showStatus);
   BHCenter center(BHomeShm());
   BHCenter center(shm);
   center.Start();
   printf("center started ...\n");
   auto msg = "center (" + shm.name() + ") started ...";
   LOG_INFO() << msg;
   printf("%s\n", msg.c_str());
   WaitForSignals({SIGINT, SIGTERM});
   run = false;
   t.join();
   center.Stop();
   LOG_INFO() << "center stopped.";
   return 0;
}