From 1504db9db05f5650a042941feaa3edf993e08da6 Mon Sep 17 00:00:00 2001 From: wyc <1104749580@qq.com> Date: Thu, 25 Jun 2026 15:01:29 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E8=BF=9B=E5=8D=8F=E7=A8=8B=E5=BE=AA?= =?UTF-8?q?=E7=8E=AF=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/config.json | 2 +- module/Local_Server.rar | Bin 96523 -> 0 bytes module/Local_Server/Data_Feed/Data_Feed.cpp | 76 +++- module/Local_Server/Data_Feed/Data_Feed.h | 27 +- .../Local_Server/Data_Source/Data_Source.cpp | 27 +- module/Local_Server/Data_Source/Data_Source.h | 41 +- module/Local_Server/Data_Source/Database.h | 17 +- module/Local_Server/server/With_Loop_Coro.cpp | 33 ++ module/Local_Server/server/With_Loop_Coro.h | 29 ++ module/Local_Server/server/io_coro.cpp | 247 ++++-------- module/Local_Server/server/io_coro.h | 36 +- module/Local_Server_main.cpp | 358 ++++++++---------- 12 files changed, 409 insertions(+), 484 deletions(-) delete mode 100644 module/Local_Server.rar create mode 100644 module/Local_Server/server/With_Loop_Coro.cpp create mode 100644 module/Local_Server/server/With_Loop_Coro.h diff --git a/config/config.json b/config/config.json index 2f0232f..bc8e183 100644 --- a/config/config.json +++ b/config/config.json @@ -122,7 +122,7 @@ }, { "key": "Port_10005", - "enable": true, + "enable": false, "type": "Data_Feed_TCP_Client", "output_format": { "type": "BIN", diff --git a/module/Local_Server.rar b/module/Local_Server.rar deleted file mode 100644 index d913b6bc64505a1915fe911713badf0cd9980298..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96523 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.data_feed_config.map.list(); for (auto& item : all_feed) { @@ -100,11 +105,11 @@ void Data_feed_Config::server(Global* g) { HTTP_REQUIRE_VALUE(key, params.try_get_string("key")) HTTP_REQUIRE_VALUE(t, map.get(key)) // 直接关闭 - t->close(); + // t->close(); t->from_json(¶ms); - if (t->enable) { - t->check_and_open(); - } + // if (t->enable) { + // t->check_and_open(); + // } Global::save(); g->mode_acs.source_feed_relation_config.set_need_refresh(); }); @@ -117,10 +122,10 @@ void Data_feed_Config::server(Global* g) { auto df = create_data_feed_from_type(t); df->from_json(data); HTTP_REQUIRE_VALUE(enable, data->try_get_bool("enable")) - if (enable) - { - df->check_and_open(); - } + // if (enable) + // { + // df->check_and_open(); + // } HTTP_REQUIRE_TRUE(map.insert(index, df), "index") res->setBody(warp(to_json()).to_json_string()); Global::save(); @@ -131,7 +136,7 @@ void Data_feed_Config::server(Global* g) { CHECK_JSON_PARAM HTTP_REQUIRE_VALUE(index, params.try_get_number("index")) HTTP_REQUIRE_VALUE(df, map.try_get(index)) - df->close(); + df->async_stop(); HTTP_REQUIRE_TRUE(map.remove(index), "index") g->save(); res->setBody(warp(to_json()).to_json_string()); @@ -194,3 +199,56 @@ Psc::JSON BIN_Msg_Buffer::state_json() { } return VAR_JSON_7(mode_s_msg_num, mode_other_msg_num, output_packet_size, cache_size, size, pool_capacity, pool_free_count); } + +concurrencpp::result Data_Feed::loop_coro( + std::shared_ptr executor_) { + auto feed = this; + co_await concurrencpp::resume_on(executor_); + auto &mode_acs = Global::instance()->mode_acs; + auto &cfg = mode_acs.data_feed_config; + auto &pool = cfg.pool_; + auto &report_data_feed_msg_mum = mode_acs.report_data_feed_msg_mum; + while (feed->enable) { + std::vector messages; + { + if (!feed->running() || !feed->registered()) { + break; + } + co_await feed->handle_in_loop_coro(); + auto s_num = feed->msg_buffer.mode_s_msg_num.load(); + auto other_num = feed->msg_buffer.mode_other_msg_num.load(); + const std::vector &all = feed->msg_buffer.get_all(); + Pool_Guard pg(&pool, all); + auto num = report_data_feed_msg_mum.load(); + auto monitor_msg_live = mode_acs.monitor_msg_live.load(); + if (monitor_msg_live && num != 0 && all.size() > num && + too_many_msg_limit.test()) { + std::ostringstream oss; + oss << "feed_key:" << feed->key << " "; + oss << "recv_s:" << s_num << " "; + oss << "recv_other:" << other_num << " "; + std::cout << oss.str() << std::endl; + } + messages.reserve(all.size()); + for (const auto *str : all) { + if (!str || str->empty()) { + std::cout << "empty feed message:" << feed->key << std::endl; + continue; + } + messages.emplace_back(*str); + } + } + if (messages.empty()) { + co_await concurrencpp::resume_on(executor_); + continue; + } + if (!feed->running() || !feed->registered()) { + break; + } + for (auto &msg : messages) { + co_await feed->send_coro(msg); + } + co_await concurrencpp::resume_on(executor_); + } + co_return; +} \ No newline at end of file diff --git a/module/Local_Server/Data_Feed/Data_Feed.h b/module/Local_Server/Data_Feed/Data_Feed.h index a69e443..92e5381 100644 --- a/module/Local_Server/Data_Feed/Data_Feed.h +++ b/module/Local_Server/Data_Feed/Data_Feed.h @@ -1,6 +1,7 @@ #pragma once #include "global.h" +#include "Local_Server/server/With_Loop_Coro.h" enum class Output_Data_Format { AVR, @@ -44,16 +45,13 @@ struct Output_Format { }; -class Data_Feed { +class Data_Feed : public With_Loop_Coro { public: - virtual ~Data_Feed() = default; - std::unique_ptr> loop_task; BIN_Msg_Buffer msg_buffer{}; - std::string key; - bool enable = false; std::string type; Output_Format output_format; Frequency_Limit_Multi sbs_flm{}; + concurrencpp::result loop_coro(std::shared_ptr executor) override; virtual void handle_in_loop() { } @@ -86,17 +84,7 @@ public: ret.append_list(get_custom_state_json().children); return ret; } - bool check_and_open() { - if (_open_) return true; - bool ret = _open(); - _open_ = true; - return ret; - } - void close() { - _open_ = false; - _close(); - } std::string to_string() { return "Data_Feed{" + VAR_STR_3(key, enable, type) + "}"; @@ -105,14 +93,7 @@ public: bool registered(); protected: Data_Feed() = default; - bool _open_ = false; - virtual bool _open() { - return true; - } - - virtual void _close() { - - } + Frequency_Limit too_many_msg_limit; }; diff --git a/module/Local_Server/Data_Source/Data_Source.cpp b/module/Local_Server/Data_Source/Data_Source.cpp index 05cf67f..5a4edae 100644 --- a/module/Local_Server/Data_Source/Data_Source.cpp +++ b/module/Local_Server/Data_Source/Data_Source.cpp @@ -590,8 +590,8 @@ void Data_Source_Config::server(Global* g) { HTTP_REQUIRE_VALUE(key, params.try_get_string("key")) HTTP_REQUIRE_VALUE(ds, map.get(key)) // 直接关闭 - ds->enable = false; - ds->close(); + // ds->enable = false; + // ds->close(); ds->from_json(¶ms); g->save(); @@ -621,11 +621,8 @@ void Data_Source_Config::server(Global* g) { CHECK_JSON_PARAM HTTP_REQUIRE_VALUE(index, params.try_get_number("index")) HTTP_REQUIRE_VALUE(ds, map.try_get(index)) - ds->enable = false; - ds->close(); - + ds->async_stop(); HTTP_REQUIRE_TRUE(map.remove(index), "index") - g->save(); res->setBody(warp(to_json()).to_json_string()); g->mode_acs.source_feed_relation_config.set_need_refresh(); @@ -650,3 +647,21 @@ void Data_Source_Config::server(Global* g) { } +concurrencpp::result Data_Source::loop_coro( + std::shared_ptr executor_) { + auto source = this; + co_await concurrencpp::resume_on(executor_); + while (enable) { + if (!source->running() || !source->registered()) { + break; + } + co_await source->handle_in_loop_coro(); + auto mode_data = co_await source->read_coro(); + if (!enable || !source->running() || !source->registered()) { + break; + } + source->process_mode_acs_data(mode_data); + co_await concurrencpp::resume_on(executor_); + } + co_return; +} diff --git a/module/Local_Server/Data_Source/Data_Source.h b/module/Local_Server/Data_Source/Data_Source.h index ce17185..fcdc776 100644 --- a/module/Local_Server/Data_Source/Data_Source.h +++ b/module/Local_Server/Data_Source/Data_Source.h @@ -4,6 +4,7 @@ #include "Data_Source_Handler.h" + namespace Psc { class SM_RingBuffer; } @@ -67,19 +68,16 @@ protected: class Data_Source : public std::enable_shared_from_this, public Data_Source_Handler { public: - ~Data_Source() override = default; - std::unique_ptr> loop_task; std::shared_ptr that(); virtual concurrencpp::result read_coro() {co_return "";}; bool registered() const; virtual Psc::JSON get_custom_state_json() = 0; Psc::JSON get_state(); - std::string last_char; // 用于处理奇数字节的情�? - // std::shared_ptr parse_format; + std::string last_char; // 用于处理奇数字节 Data_Source(); + concurrencpp::result loop_coro(std::shared_ptr executor) override; std::shared_ptr last_prase_msg = nullptr; virtual concurrencpp::result handle_in_loop_coro(){co_return;} - std::atomic enable{}; std::string type; std::atomic base_station_show{}; std::atomic aircraft_show{}; @@ -144,29 +142,12 @@ public: Get_J(keep_mode); // parse_format->from_json(that_json->get("parse_format")); } - bool open() { - if (!_open_) { - _open_ = _open(); - return _open_; - } - return true; - } - bool is_open() const { return _open_; } - void close() { - if (_open_) { - _open_ = false; - _close(); - } - } std::string buffer; -protected: - bool _open_ = false; - virtual bool _open() = 0; - virtual void _close() = 0; }; -struct TCP_Client_Data_Source : Data_Source { +class TCP_Client_Data_Source : public Data_Source { +public: concurrencpp::result handle_in_loop_coro() override { co_await cli.tick_coro(); co_return; @@ -212,7 +193,8 @@ struct TCP_Client_Data_Source : Data_Source { co_return co_await cli.read_coro(); } }; -struct Serial_Data_Source : Data_Source { +class Serial_Data_Source : public Data_Source { +public: std::string port_name; Baud_Rate_Type baud_rate{}; Psc::JSON get_custom_state_json() override { @@ -283,7 +265,8 @@ enum class File_Data_Type { enum Play_Mode { one, loop, analysis, time_batch }; -struct File_Data_Source : public Data_Source { +class File_Data_Source : public Data_Source { +public: std::string file_path; File_Data_Type data_type = File_Data_Type::BIN_Blank_Text; Play_Mode play_mode = Play_Mode::one; @@ -343,7 +326,8 @@ struct File_Data_Source : public Data_Source { std::vector part_infos; std::mutex mtx; }; -struct Dll_Data_Source : Data_Source { +class Dll_Data_Source : public Data_Source { +public: Psc::JSON get_custom_state_json() override { auto ret = VAR_JSON_1(state); ret.append({"read_vaild_len", vs.to_string()}); @@ -410,7 +394,8 @@ struct Dll_Data_Source : Data_Source { }; -struct Shared_Memory_Data_Source : Data_Source { +class Shared_Memory_Data_Source : public Data_Source { +public: Psc::JSON get_custom_state_json() override { return Psc::JSON::object(); } diff --git a/module/Local_Server/Data_Source/Database.h b/module/Local_Server/Data_Source/Database.h index edb9901..5a17183 100644 --- a/module/Local_Server/Data_Source/Database.h +++ b/module/Local_Server/Data_Source/Database.h @@ -1,14 +1,15 @@ #pragma once -#include "BaseStation.h" #include "../Aircraft/Aircraft.h" #include "../Aircraft/Flight_VTO.h" #include "../External_Database/export.h" -#include -#include -#include -#include -#include +#include "BaseStation.h" +#include "Local_Server/server/With_Loop_Coro.h" +#include +#include +#include +#include +#include template < typename Key_Type, @@ -191,7 +192,7 @@ protected: }; -class DataBase : public SSR::Data_Source_Interface { +class DataBase : public SSR::Data_Source_Interface, public With_Loop_Coro { public: std::shared_ptr get_aircraft(const std::string& icao) override; std::shared_ptr create_aircraft(const std::string& icao) override; @@ -202,7 +203,7 @@ public: std::string get_key() override { return key; } - std::string key; + std::atomic have_pos_aircraft_num{}; Psc::JSON get_all_aircraft_json(); Psc::JSON get_aircraft_list_after(time_t timestamp); diff --git a/module/Local_Server/server/With_Loop_Coro.cpp b/module/Local_Server/server/With_Loop_Coro.cpp new file mode 100644 index 0000000..a97732d --- /dev/null +++ b/module/Local_Server/server/With_Loop_Coro.cpp @@ -0,0 +1,33 @@ +#include "With_Loop_Coro.h" + +With_Loop_Coro::~With_Loop_Coro() { + +} +void With_Loop_Coro::async_stop() { + enable = false; + loop_task.reset(); +} +void With_Loop_Coro::sync_wait() { + if (!loop_task) return; + while (loop_task->status() != concurrencpp::result_status::idle) + ; +} +bool With_Loop_Coro::running() { + if (!loop_task) return false; + return loop_task->status() == concurrencpp::result_status::idle; +} + +void With_Loop_Coro::sync_coro_loop_and_enable( +std::shared_ptr executor) { + if (enable && !running()) { + _open(); + loop_task = std::make_shared>(loop_coro(executor)); + // 启动任务 + std::cout <<"启动任务! " << key << "!" < +#include +#include +#include +#include +#include +#include +#include +#include + + +class With_Loop_Coro { +public: + virtual ~With_Loop_Coro(); + std::shared_ptr> loop_task; + virtual concurrencpp::result loop_coro(std::shared_ptr executor) = 0; + void async_stop(); + void sync_wait(); + bool running(); + // 同步协程循环 和enable的关系 + void sync_coro_loop_and_enable(std::shared_ptr executor); + std::string key; + std::atomic enable{}; + virtual bool _open() { return true; } + virtual void _close() {} +}; + + diff --git a/module/Local_Server/server/io_coro.cpp b/module/Local_Server/server/io_coro.cpp index 2270890..d48fd86 100644 --- a/module/Local_Server/server/io_coro.cpp +++ b/module/Local_Server/server/io_coro.cpp @@ -1,186 +1,83 @@ +#include "io_coro.h" #include "../server/Global.h" #include "../server/Mode_Msg_Buffer.h" -#include "io_coro.h" + +#include "Core/Statistics/Frequency_Limit.h" +#include "Local_Server/Data_Feed/Data_Feed.h" +#include "Local_Server/Data_Source/Data_Source.h" + + + +std::vector> get_all() { + auto g = Global::instance(); + std::vector> ret; + + auto sources = g->mode_acs.data_source_config.map.list(); + for (auto &source : sources) { + ret.emplace_back(source); + } + auto feeds = g->mode_acs.data_feed_config.map.list(); + for (auto &feed : feeds) { + ret.emplace_back(feed); + } + return ret; +} + +bool Coro::has_running_loop_tasks() { + auto list = get_all(); + for (auto &li : list) { + if (li->running()) { + return true; + } + } + return false; +} + +void Coro::start() { + std::cout << "start_io_coro" << std::endl; + running.store(true, std::memory_order_release); + executor_ = runtime_.make_worker_thread_executor(); + data_feed_thread_task = + std::make_unique>(coro_thread()); +} + +void Coro::stop() { + running.store(false, std::memory_order_release); + auto list = get_all(); + for (auto &li : list) { + li->async_stop(); + } + for (auto &li : list) { + li->sync_wait(); + } +} + concurrencpp::result Coro::coro_thread() { - co_await concurrencpp::resume_on(executor_); - auto g = Global::instance(); - for (auto& feed : g->mode_acs.data_feed_config.map.list()) { - if (feed->enable) { - auto ret = feed->check_and_open(); - if (!ret) { - std::cout << "Data feed first open failed: " << feed->key << std::endl; - } - } - } - while (running.load(std::memory_order_acquire)) { - auto sources = Global::instance()->mode_acs.data_source_config.map.list(); - for (auto& source : sources) { - if (!source || !source->enable) { - continue; - } - if (task_is_running(source->loop_task)) { - continue; - } - if (!source->is_open() && !source->open()) { - continue; - } - source->loop_task = std::make_unique>(data_source_loop_coro(source)); - } - auto feeds = Global::instance()->mode_acs.data_feed_config.map.list(); - for (auto& feed : feeds) { - if (!feed || !feed->enable) { - continue; - } - if (task_is_running(feed->loop_task)) { - continue; - } - auto ret = feed->check_and_open(); - if (!ret) { - continue; - } - feed->loop_task = std::make_unique>(data_feed_loop_coro(feed)); - } - co_await concurrencpp::resume_on(executor_); - } - auto start = std::chrono::steady_clock::now(); - while (has_running_loop_tasks()) { - if (std::chrono::steady_clock::now() - start > std::chrono::seconds(10)) { - std::cerr << "data loop task stop timeout" << std::endl; - break; - } - co_await concurrencpp::resume_on(executor_); - } - co_return; -} + co_await concurrencpp::resume_on(executor_); -void Coro::start() { - if (data_feed_thread_task) { - return; - } - std::cout << "start_io_coro" << std::endl; - running.store(true, std::memory_order_release); - executor_ = runtime_.make_worker_thread_executor(); - data_feed_thread_task = std::make_unique>(coro_thread()); -} + while (running.load(std::memory_order_acquire)) { + auto list = get_all(); + // 同步协程循环 和enable的关系 + for (auto &li : list) li->sync_coro_loop_and_enable(executor_); - -void Coro::stop() { - running.store(false, std::memory_order_release); - if (!data_feed_thread_task) { - return; - } - try { - data_feed_thread_task->get(); - } - catch (const std::exception& e) { - std::cerr << "data_feed_thread_coro exception: " << e.what() << std::endl; - Psc::fail_fast_core_dump(""); - } - catch (...) { - std::cerr << "data_feed_thread_coro unknown exception" << std::endl; - Psc::fail_fast_core_dump(""); - } - data_feed_thread_task.reset(); - executor_.reset(); -} - -bool Coro::task_is_running(std::unique_ptr>& task) { - if (!task) { - return false; - } - if (task->status() == concurrencpp::result_status::idle) { - return true; - } - task->get(); - task.reset(); - return false; -} -concurrencpp::result Coro::data_source_loop_coro(std::shared_ptr source) { co_await concurrencpp::resume_on(executor_); - while (running.load(std::memory_order_acquire)) { - if (!source->enable || !source->registered()) { - break; - } - if (!source->is_open() && !source->open()) { - co_await concurrencpp::resume_on(executor_); - continue; - } - co_await source->handle_in_loop_coro(); - auto mode_data = co_await source->read_coro(); - if (!running.load(std::memory_order_acquire) || !source->enable || !source->registered()) { - break; - } - source->process_mode_acs_data(mode_data); - co_await concurrencpp::resume_on(executor_); + } + auto list = get_all(); + for (auto &li : list) li->sync_wait(); + // 退出时清理 + auto start = std::chrono::steady_clock::now(); + while (has_running_loop_tasks()) { + if (std::chrono::steady_clock::now() - start > std::chrono::seconds(10)) { + std::cerr << "data loop task stop timeout" << std::endl; + break; } - co_return; -} -concurrencpp::result Coro::data_feed_loop_coro(std::shared_ptr feed) { - co_await concurrencpp::resume_on(executor_); - auto& mode_acs = Global::instance()->mode_acs; - auto& cfg = mode_acs.data_feed_config; - auto& pool = cfg.pool_; - auto& report_data_feed_msg_mum = mode_acs.report_data_feed_msg_mum; - while (running.load(std::memory_order_acquire)) { - std::vector messages; - { - if (!feed->enable || !feed->registered()) { - break; - } - co_await feed->handle_in_loop_coro(); - auto s_num = feed->msg_buffer.mode_s_msg_num.load(); - auto other_num = feed->msg_buffer.mode_other_msg_num.load(); - const std::vector& all = feed->msg_buffer.get_all(); - Pool_Guard pg(&pool, all); - auto num = report_data_feed_msg_mum.load(); - auto monitor_msg_live = mode_acs.monitor_msg_live.load(); - if (monitor_msg_live && num != 0 && all.size() > num && too_many_msg_limit.test()) { - std::ostringstream oss; - oss << "feed_key:" << feed->key << " "; - oss << "recv_s:" << s_num << " "; - oss << "recv_other:" << other_num << " "; - std::cout << oss.str() << std::endl; - } - messages.reserve(all.size()); - for (const auto* str : all) { - if (!str || str->empty()) { - std::cout << "empty feed message:" << feed->key << std::endl; - continue; - } - messages.emplace_back(*str); - } - } - if (messages.empty()) { - co_await concurrencpp::resume_on(executor_); - continue; - } - if (!feed->enable || !feed->registered()) { - break; - } - for (auto& msg : messages) { - co_await feed->send_coro(msg); - } - co_await concurrencpp::resume_on(executor_); - } - co_return; - } - -bool Coro::has_running_loop_tasks() { - auto sources = Global::instance()->mode_acs.data_source_config.map.list(); - for (auto& source : sources) { - if (source && task_is_running(source->loop_task)) { - return true; - } - } - auto feeds = Global::instance()->mode_acs.data_feed_config.map.list(); - for (auto& feed : feeds) { - if (feed && task_is_running(feed->loop_task)) { - return true; - } - } - return false; + co_await concurrencpp::resume_on(executor_); + } + co_return; } + + + diff --git a/module/Local_Server/server/io_coro.h b/module/Local_Server/server/io_coro.h index e654764..8e1c248 100644 --- a/module/Local_Server/server/io_coro.h +++ b/module/Local_Server/server/io_coro.h @@ -1,31 +1,17 @@ #pragma once -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "Core/Statistics/Frequency_Limit.h" -#include "Local_Server/Data_Feed/Data_Feed.h" -#include "Local_Server/Data_Source/Data_Source.h" +#include "With_Loop_Coro.h" + class Coro { public: - void start(); - void stop(); + void start(); + void stop(); + private: - bool task_is_running(std::unique_ptr>& task); - concurrencpp::result data_source_loop_coro(std::shared_ptr source); - concurrencpp::result data_feed_loop_coro(std::shared_ptr feed); - concurrencpp::result coro_thread(); - bool has_running_loop_tasks(); - Frequency_Limit too_many_msg_limit; - Frequency_Limit flush_limit; - concurrencpp::runtime runtime_; - std::shared_ptr executor_; - std::unique_ptr> data_feed_thread_task; - std::atomic running = false; + concurrencpp::result coro_thread(); + bool has_running_loop_tasks(); + concurrencpp::runtime runtime_; + std::shared_ptr executor_; + std::unique_ptr> data_feed_thread_task; + std::atomic running = false; }; diff --git a/module/Local_Server_main.cpp b/module/Local_Server_main.cpp index f3735fc..80baf68 100644 --- a/module/Local_Server_main.cpp +++ b/module/Local_Server_main.cpp @@ -1,237 +1,177 @@ #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" // ./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 + 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; - + std::cout << "\t内存占用" << rate << "%" << std::endl; + stop_program = SIGINT; #if WIN32 #else - system("top"); + 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([](const std::string& 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); - } + return true; } - }); - // 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; - - Coro coro; - - coro.start(); - - - // Catch_Memory cm; - while (stop_program == 0) { - for (auto &ds : g->mode_acs.data_source_config.map.list()) { - ds->delete_timeout_aircraft(); + return false; } - - if (enable) { - g->mlat.refresh(); - } -#ifdef __linux__ - if (g->mode_acs.monitor_msg_live) - malloc_trim(0); +#if WIN32 + std::int64_t memory_max = 1 * 1024 * 1024 * 1024; +#else + std::int64_t memory_max = 1 * 1024 * 1024 * 1024; #endif - std::this_thread::sleep_for(std::chrono::seconds(3)); - if (Global::instance()->init_ok) { - // if (cm.catch_ok()) { - // stop_program = SIGINT; - // break; - // } + 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; } - } - - coro.stop(); - - if (stop_program == SIGINT || stop_program == SIGTERM) { - clear(); - } - - return 0; + // 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([](const std::string& 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; + Coro coro; + 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); -} - - - - -// int main(int argc, char* argv[]) { -// -// Psc::set_console_utf8(); -// std::cout << "asio 起点" << std::endl; -// -// return 0; -// } +} \ No newline at end of file