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;