#include #include #include "Local_Server/Crawler/Crawler.h" #include "Local_Server/Data_Source/Data_Source.h" #include "Local_Server/State_Report/State_Report.h" #include "Local_Server/server/Global.h" #include #include #include #include #include #include "Local_Server/server/io_coro.h" #include // ./server ./config.json #ifdef __linux__ #include #endif struct Catch_Memory { Catch_Memory() { sm = (std::int64_t) get_system_memory(); cur = (std::int64_t) get_process_memory(); } std::int64_t MB = 1024 * 1024; bool catch_ok() { auto old_memory = cur; cur = (std::int64_t) get_process_memory(); auto change_mb = (cur - old_memory) / MB; auto cur_mb = cur / MB; // std::cout << get_current_date_string() << " 时内存" << cur_mb << "MB " // << " 变更" << change_mb << "MB" << std::endl; if (cur > memory_max) { auto rate = (double) cur / (double) sm; std::cout << get_current_date_string() + " 抓住内存暴涨:" << cur_mb << "MB" << " 变更" << change_mb << "MB" << std::endl; std::cout << "\t内存占用" << rate << "%" << std::endl; stop_program = SIGINT; #if WIN32 #else system("top"); #endif return true; } return false; } #if WIN32 std::int64_t memory_max = 1 * 1024 * 1024 * 1024; #else std::int64_t memory_max = 1 * 1024 * 1024 * 1024; #endif std::int64_t cur; std::int64_t sm; }; int psc_main(int argc, char *argv[]) { std::cout << "wyc_main" << std::endl; if (argc >= 2) { std::string config_path = argv[1]; if (config_path.at(0) == '@') { config_path.replace(0, 1, get_exe_dir()); } ::default_config_path = config_path; } // std::cout << get_stack_trace() << std::endl; init_signal_config({SIGINT, SIGTERM}, #ifdef WIN32 {} #else { SIGPIPE } #endif ); auto clear = []() { std::cout << "保存配置文件 " << LOG_POS << std::endl; Config::save(); std::cout << "shutdown" << std::endl; auto i = Global::instance(); i->svr.stop(); i->thread_manager.stop_all_thread(); Global::instance()->dsp_config.close_dsp_device(); std::cout << "destroy开始" << std::endl; Global::destroy(); std::cout << " Base_Logger_Manager::instance()->destroy()开始" << std::endl; Base_Logger_Manager::destroy(); std::cout << " clear完成" << std::endl; std::cout << " 正常退出" << std::endl; }; auto g = Global::instance(); Psc::set_fail_fast([](std::string_view name) { // 如果是在 Global::instance() 里面失败是不能调用这个处理函数的 auto g = Global::instance(); std::cout << "set_fail_fast 退出原因: 222" << name << std::endl; std::cout << "shutdown" << LOG_POS << std::endl; auto id = std::this_thread::get_id(); std::cout << "id: " << id << std::endl; Detach_Thread *dt = g->thread_manager.get_thread(id); if (!dt) { std::cout << VAR_STR_1((void*)dt) << std::endl; std::terminate(); } std::set excluded_thread; excluded_thread.insert(dt->name); std::cout << dt->name << std::endl; // std::cout << "保存配置文件 " << LOG_POS << std::endl; // Config::save(); g->svr.stop(); g->thread_manager.stop_all_thread(10000, excluded_thread); std::cout << "22222222" << std::endl; Global::instance()->dsp_config.close_dsp_device(); std::cout << "destroy开始" << std::endl; Global::destroy(); std::cout << " Base_Logger_Manager::instance()->destroy()开始" << std::endl; Base_Logger_Manager::destroy(); std::cout << " clear完成" << std::endl; std::cout << " std::exit(75) " << name << std::endl; std::exit(75); std::cout << "std::exit(75) 完成:" << name << std::endl; }); Detach_Thread_Manager &manager = g->thread_manager; std::cout << "[主线程:" << std::this_thread::get_id() << "]" << " \n" << std::flush; manager.test_and_start_thread( "web服务器线程", [g](std::atomic &running) { auto &c = Global::instance()->device_config; std::string ip = "0.0.0.0"; #ifdef WIN32 ip = "127.0.0.1"; #endif Net_Config *device = c.list.get("device").value(); std::cout << "http://" + ip + ":" + std::to_string(device->port) + "\n" << std::flush; std::cout << "http://" + device->ip + ":" + std::to_string(device->port) + "\n" << std::flush; if (!g->svr.listen("0.0.0.0", device->port)) { if (running.load(std::memory_order_acquire)) { std::cout << "http://" + ip + ":" + std::to_string(device->port) + "启动失败 退出!\n" << std::flush; std::cout << "http://" + device->ip + ":" + std::to_string(device->port) + "启动失败 退出!\n" << std::flush; std::exit(0); } } }); // manager.test_and_start_thread("io_coro 协程线程", io_coro); static int t = Global::instance()->mode_acs.read_milliseconds; g->dsp_config.init_env(); bool enable = g->mlat.enable; auto coro = Coro::instance(); coro->start(); // Catch_Memory cm; while (stop_program == 0) { for (auto &ds: g->mode_acs.data_source_config.map.list()) { ds->delete_timeout_aircraft(); } if (enable) { g->mlat.refresh(); } #ifdef __linux__ if (g->mode_acs.monitor_msg_live) malloc_trim(0); #endif std::this_thread::sleep_for(std::chrono::seconds(3)); if (Global::instance()->init_ok) { // if (cm.catch_ok()) { // stop_program = SIGINT; // break; // } } } coro->stop(); if (stop_program == SIGINT || stop_program == SIGTERM) { clear(); } return 0; } int main(int argc, char *argv[]) { return redict_main_with_gtest(argc, argv, psc_main); }