From 7788b68bbed2d8f5b174737dbbe7b11378eb08d3 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Fri, 5 Jan 2024 19:54:00 +0100 Subject: [PATCH] Fix: don't unneededly block on transmitting survey on exit (#11687) --- src/network/network_survey.cpp | 15 ++++++++++++--- src/network/network_survey.h | 3 ++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/network/network_survey.cpp b/src/network/network_survey.cpp index 9f496a68d6..5e73ffb0b0 100644 --- a/src/network/network_survey.cpp +++ b/src/network/network_survey.cpp @@ -11,6 +11,7 @@ #include "network_survey.h" #include "settings_table.h" #include "network.h" +#include "network_func.h" #include "../debug.h" #include "../survey.h" #include "../3rdparty/fmt/chrono.h" @@ -99,21 +100,29 @@ void NetworkSurveyHandler::Transmit(Reason reason, bool blocking) if (blocking) { std::unique_lock lock(this->mutex); + /* Block no longer than 2 seconds. If we failed to send the survey in that time, so be it. */ - this->loaded.wait_for(lock, std::chrono::seconds(2)); + std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now() + std::chrono::seconds(2); + + while (!this->transmitted && std::chrono::steady_clock::now() < end) { + NetworkBackgroundLoop(); + this->transmitted_cv.wait_for(lock, std::chrono::milliseconds(30)); + } } } void NetworkSurveyHandler::OnFailure() { Debug(net, 1, "Survey: failed to send survey results"); - this->loaded.notify_all(); + this->transmitted = true; + this->transmitted_cv.notify_all(); } void NetworkSurveyHandler::OnReceiveData(std::unique_ptr data, size_t) { if (data == nullptr) { Debug(net, 1, "Survey: survey results sent"); - this->loaded.notify_all(); + this->transmitted = true; + this->transmitted_cv.notify_all(); } } diff --git a/src/network/network_survey.h b/src/network/network_survey.h index 1136e2780d..8acddb9ede 100644 --- a/src/network/network_survey.h +++ b/src/network/network_survey.h @@ -41,7 +41,8 @@ public: private: std::mutex mutex; ///< Mutex for the condition variable. - std::condition_variable loaded; ///< Condition variable to wait for the survey to be sent. + std::atomic transmitted; ///< Whether the survey has been transmitted. + std::condition_variable transmitted_cv; ///< Condition variable to inform changes to transmitted. }; extern NetworkSurveyHandler _survey;