From f6bf4eeed0c9ee12aa356ce0e4bb62d606efca76 Mon Sep 17 00:00:00 2001 From: Nova Date: Fri, 15 Aug 2025 16:52:10 +0330 Subject: [PATCH] fix profile stop --- include/ui/mainwindow.h | 3 +-- src/sys/Process.cpp | 7 +++++-- src/ui/mainwindow.cpp | 3 --- src/ui/mainwindow_grpc.cpp | 25 +++++++++++++++---------- 4 files changed, 21 insertions(+), 17 deletions(-) diff --git a/include/ui/mainwindow.h b/include/ui/mainwindow.h index 18d6dde..47393b3 100644 --- a/include/ui/mainwindow.h +++ b/include/ui/mainwindow.h @@ -66,7 +66,7 @@ public: void profile_start(int _id = -1); - void profile_stop(bool crash = false, bool sem = false, bool manual = false); + void profile_stop(bool crash = false, bool block = false, bool manual = false); void set_spmode_system_proxy(bool enable, bool save = true); @@ -193,7 +193,6 @@ private: QMutex mu_starting; QMutex mu_stopping; QMutex mu_exit; - QSemaphore sem_stopped; int exit_reason = 0; // QMutex mu_download_assets; diff --git a/src/sys/Process.cpp b/src/sys/Process.cpp index 8bf749c..2c3238a 100644 --- a/src/sys/Process.cpp +++ b/src/sys/Process.cpp @@ -5,6 +5,8 @@ #include #include +#include "include/ui/mainwindow.h" + namespace Configs_sys { CoreProcess::~CoreProcess() { } @@ -59,7 +61,8 @@ namespace Configs_sys { if (failed_to_start) return; // no retry if (restarting) return; - MW_dialog_message("ExternalProcess", "CoreCrashed"); + MW_show_log("[Fatal] " + QObject::tr("Core exited, cleaning up...")); + GetMainWindow()->profile_stop(true, true); // Retry rate limit if (coreRestartTimer.isValid()) { @@ -74,7 +77,7 @@ namespace Configs_sys { // Restart start_profile_when_core_is_up = Configs::dataStore->started_id; - MW_show_log("[Fatal] " + QObject::tr("Core exited, restarting.")); + MW_show_log("[Warn] " + QObject::tr("Restarting the core ...")); setTimeout([=,this] { Restart(); }, this, 200); } }); diff --git a/src/ui/mainwindow.cpp b/src/ui/mainwindow.cpp index 373f647..9ba5d76 100644 --- a/src/ui/mainwindow.cpp +++ b/src/ui/mainwindow.cpp @@ -772,8 +772,6 @@ void MainWindow::dialog_message_impl(const QString &sender, const QString &info) } else if (sender == "ExternalProcess") { if (info == "Crashed") { profile_stop(); - } else if (info == "CoreCrashed") { - profile_stop(true); } else if (info.startsWith("CoreStarted")) { Configs::IsAdmin(true); if (Configs::dataStore->remember_enable || Configs::dataStore->flag_restart_tun_on) { @@ -879,7 +877,6 @@ void MainWindow::prepare_exit() // Configs::dataStore->save_control_no_save = true; // don't change datastore after this line profile_stop(false, true); - sem_stopped.acquire(); QMutex coreKillMu; coreKillMu.lock(); diff --git a/src/ui/mainwindow_grpc.cpp b/src/ui/mainwindow_grpc.cpp index e36b0f5..805944e 100644 --- a/src/ui/mainwindow_grpc.cpp +++ b/src/ui/mainwindow_grpc.cpp @@ -524,8 +524,7 @@ void MainWindow::profile_start(int _id) { runOnNewThread([=, this] { // stop current running if (running != nullptr) { - runOnUiThread([=,this] { profile_stop(false, true, true); }); - sem_stopped.acquire(); + profile_stop(false, true, true); } // do start MW_show_log(">>>>>>>> " + tr("Starting profile %1").arg(ent->bean->DisplayTypeAndName())); @@ -564,12 +563,11 @@ void MainWindow::set_spmode_system_proxy(bool enable, bool save) { refresh_status(); } -void MainWindow::profile_stop(bool crash, bool sem, bool manual) { - auto id = Configs::dataStore->started_id; - if (id < 0) { - if (sem) sem_stopped.release(); +void MainWindow::profile_stop(bool crash, bool block, bool manual) { + if (running == nullptr) { return; } + auto id = running->id; auto profile_stop_stage2 = [=,this] { if (!crash) { @@ -586,9 +584,10 @@ void MainWindow::profile_stop(bool crash, bool sem, bool manual) { }; if (!mu_stopping.tryLock()) { - if (sem) sem_stopped.release(); return; } + QMutex blocker; + if (block) blocker.lock(); // timeout message auto restartMsgbox = new QMessageBox(QMessageBox::Question, software_name, tr("If there is no response for a long time, it is recommended to restart the software."), @@ -612,7 +611,7 @@ void MainWindow::profile_stop(bool crash, bool sem, bool manual) { restartMsgboxTimer->deleteLater(); restartMsgbox->deleteLater(); - runOnNewThread([=, this] { + runOnNewThread([=, this, &blocker] { // do stop MW_show_log(">>>>>>>> " + tr("Stopping profile %1").arg(running->bean->DisplayTypeAndName())); if (!profile_stop_stage2()) { @@ -623,13 +622,19 @@ void MainWindow::profile_stop(bool crash, bool sem, bool manual) { Configs::dataStore->need_keep_vpn_off = false; running = nullptr; - if (sem) sem_stopped.release(); + if (block) blocker.unlock(); - runOnUiThread([=, this] { + runOnUiThread([=, this, &blocker] { refresh_status(); refresh_proxy_list_impl_refresh_data(id, true); mu_stopping.unlock(); }); }); + + if (block) + { + blocker.lock(); + blocker.unlock(); + } }