From 72851db66655912cb9c92300a80985fb9797d168 Mon Sep 17 00:00:00 2001 From: lichao <lichao@aiotlink.com> Date: 星期二, 01 六月 2021 16:25:23 +0800 Subject: [PATCH] remove AtomicQueue, not used. --- box/center_main.cc | 112 ++++++++++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 97 insertions(+), 15 deletions(-) diff --git a/box/center_main.cc b/box/center_main.cc index 5baa409..e7715f8 100644 --- a/box/center_main.cc +++ b/box/center_main.cc @@ -19,36 +19,118 @@ #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; +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); if (args.Has("remove")) { - BHomeShm().Remove(); + SharedMemory::Remove(BHomeShmName()); return 0; } - 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); + 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); } - BHCenter center(BHomeShm()); + auto &shm = BHomeShm(); + if (!CenterInit(shm)) { + auto msg = "init memory error."; + LOG_FATAL() << msg; + printf("%s\n", msg); + exit(0); + } + 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. + } + + BHCenter center(shm); center.Start(); - printf("center started ...\n"); + + auto msg = "center started ..."; + LOG_INFO() << msg; + printf("%s\n", msg); WaitForSignals({SIGINT, SIGTERM}); - run = false; - t.join(); + center.Stop(); + LOG_INFO() << "center stopped."; return 0; } -- Gitblit v1.8.0