119 lines
4.6 KiB
C++
119 lines
4.6 KiB
C++
#include <SQLiteCpp/SQLiteCpp.h>
|
|
#include <SQLiteCpp/VariadicBind.h>
|
|
#include <codecvt>
|
|
#include <csignal>
|
|
#include <future>
|
|
#include <iostream>
|
|
#include <string_view>
|
|
#include <thread>
|
|
#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<std::string> 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<bool>& 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);
|
|
}
|