diff --git a/src/common/http_downloader.cpp b/src/common/http_downloader.cpp index 847c75469b..2dde604c63 100644 --- a/src/common/http_downloader.cpp +++ b/src/common/http_downloader.cpp @@ -70,6 +70,12 @@ void HTTPDownloader::CreatePostRequest(std::string url, std::string post_data, R LockedAddRequest(req); } +bool HTTPDownloader::HasAnyRequests() +{ + std::unique_lock lock(m_pending_http_request_lock); + return !m_pending_http_requests.empty(); +} + void HTTPDownloader::LockedPollRequests(std::unique_lock& lock) { if (m_pending_http_requests.empty()) diff --git a/src/common/http_downloader.h b/src/common/http_downloader.h index e8485cb55b..dce780c187 100644 --- a/src/common/http_downloader.h +++ b/src/common/http_downloader.h @@ -64,6 +64,8 @@ class HTTPDownloader void CreateRequest(std::string url, Request::Callback callback); void CreatePostRequest(std::string url, std::string post_data, Request::Callback callback); + + bool HasAnyRequests(); void PollRequests(); void WaitForAllRequests(); diff --git a/src/frontend-common/achievements.cpp b/src/frontend-common/achievements.cpp index 4cc812c0f4..21754bbfa8 100644 --- a/src/frontend-common/achievements.cpp +++ b/src/frontend-common/achievements.cpp @@ -707,6 +707,14 @@ bool Achievements::DoState(StateWrapper& sw) if (sw.IsReading()) { + // if we're active, make sure we've downloaded and activated all the achievements + // before deserializing, otherwise that state's going to get lost. + if (s_http_downloader->HasAnyRequests()) + { + Host::DisplayLoadingScreen("Downloading achievements data..."); + s_http_downloader->WaitForAllRequests(); + } + u32 data_size = 0; sw.Do(&data_size); if (data_size == 0) @@ -1321,6 +1329,7 @@ void Achievements::GameChanged(const std::string& path, CDImage* image) if (!temp_image) { Log_ErrorPrintf("Failed to open temporary CD image '%s'", path.c_str()); + s_http_downloader->WaitForAllRequests(); std::unique_lock lock(s_achievements_mutex); DisableChallengeMode(); ClearGameInfo(); @@ -1341,7 +1350,11 @@ void Achievements::GameChanged(const std::string& path, CDImage* image) } } - s_http_downloader->WaitForAllRequests(); + if (s_http_downloader->HasAnyRequests()) + { + Host::DisplayLoadingScreen("Downloading achievements data..."); + s_http_downloader->WaitForAllRequests(); + } if (image && image->HasSubImages() && image->GetCurrentSubImage() != 0) {