#include #include #include #include #include #include #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 "Local_Server/server/Memory_Monitor.h" #include "Local_Server/server/Memory_Resource.h" #include "Local_Server/server/io_coro.h" int psc_main(int argc, char* argv[]) { std::cout << "wyc_main" << std::endl; if (argc >= 2) { std::string config_directory = argv[1]; if (config_directory.at(0) == '@') { config_directory.replace(0, 1, get_exe_dir()); } ::default_config_directory = config_directory; } // 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 退出原因: " << 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) { const auto port = g->web_server_config.listen_port; std::string display_ip = "0.0.0.0"; #ifdef WIN32 display_ip = "127.0.0.1"; #endif std::cout << "http://" + display_ip + ":" + std::to_string(port) + "\n" << std::flush; if (!g->svr.listen("0.0.0.0", port)) { if (running.load(std::memory_order_acquire)) { std::cout << "http://" + display_ip + ":" + std::to_string(port) + "启动失败 退出!\n" << std::flush; std::exit(0); } } }); // manager.test_and_start_thread("io_coro 协程线程", io_coro); g->dsp_config.init_env(); auto coro = Coro::instance(); coro->start(); while (stop_program == 0) { for (auto& ds : g->mode_acs.data_source_config.map.list()) { ds->delete_timeout_aircraft(); } if (g->mode_acs.settings.member<&Mode_ACS_Config_Data::monitor_msg_live>().snapshot()) collect_server_memory(false); Memory_Monitor::instance().sample(); std::this_thread::sleep_for(std::chrono::seconds(3)); } coro->stop(); if (stop_program == SIGINT || stop_program == SIGTERM) { clear(); } return 0; } int main(int argc, char* argv[]) { initialize_server_memory_resource(); Memory_Monitor::instance().sample(); return redict_main_with_gtest(argc, argv, psc_main); }