lichao
2021-06-02 993c556000a414011626770540678948f16eaa9e
box/center_main.cc
@@ -27,63 +27,6 @@
using namespace std::chrono_literals;
using namespace bhome_shm;
namespace
{
const std::string kCenterRunningFlag = "bh_center_single_flag_0";
class InstanceFlag
{
public:
   InstanceFlag(SharedMemory &shm, const std::string &name) :
       shm_(shm), name_(name), run_(false) {}
   ~InstanceFlag() { Stop(); }
   bool TryStartAsFirstInstance()
   {
      if (run_) {
         return true;
      }
      auto mtx(shm_.FindOrCreate<Mutex>(name_ + "_mutex_0"));
      auto time_stamp(shm_.FindOrCreate<int64_t>(name_ + "_timestamp_0", 0));
      if (mtx && time_stamp) {
         Guard lock(*mtx);
         auto now = NowSec();
         LOG_DEBUG() << "old: " << *time_stamp << ", now: " << now;
         if (now > *time_stamp + 10) {
            *time_stamp = now;
            auto UpdateTime = [this, time_stamp]() {
               while (run_) {
                  std::this_thread::sleep_for(1s);
                  *time_stamp = NowSec();
               }
            };
            run_.store(true);
            std::thread(UpdateTime).swap(worker_);
            return true;
         }
      }
      return false;
   }
private:
   void Stop()
   {
      run_.store(false);
      if (worker_.joinable()) {
         worker_.join();
      }
   }
   std::thread worker_;
   SharedMemory &shm_;
   std::string name_;
   std::atomic<bool> run_;
};
} // namespace
int center_main(int argc, const char *argv[])
{
   AppArg args(argc, argv);
@@ -101,22 +44,14 @@
   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); }
   auto &shm = BHomeShm();
   if (!CenterInit(shm)) {
      auto msg = "init memory error.";
   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);
   InstanceFlag inst(shm, kCenterRunningFlag);
   if (!inst.TryStartAsFirstInstance()) {
      auto msg = "another instance is running, exit.";
      LOG_INFO() << msg;
      printf("%s\n", msg);
      return 0;
   }
   if (args.Has("daemon") || args.Has("d")) {
      int r = daemon(0, 0); // TODO center control msg to close itself.
@@ -125,9 +60,9 @@
   BHCenter center(shm);
   center.Start();
   auto msg = "center started ...";
   auto msg = "center (" + shm.name() + ") started ...";
   LOG_INFO() << msg;
   printf("%s\n", msg);
   printf("%s\n", msg.c_str());
   WaitForSignals({SIGINT, SIGTERM});
   center.Stop();
   LOG_INFO() << "center stopped.";