Skip to content

Commit

Permalink
Achievements: Drain outstanding requests when switching games
Browse files Browse the repository at this point in the history
Stops data being lost when loading state due to data not being
downloaded yet.
  • Loading branch information
stenzek committed Sep 18, 2022
1 parent d972251 commit aee8163
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 1 deletion.
6 changes: 6 additions & 0 deletions src/common/http_downloader.cpp
Expand Up @@ -70,6 +70,12 @@ void HTTPDownloader::CreatePostRequest(std::string url, std::string post_data, R
LockedAddRequest(req);
}

bool HTTPDownloader::HasAnyRequests()
{
std::unique_lock<std::mutex> lock(m_pending_http_request_lock);
return !m_pending_http_requests.empty();
}

void HTTPDownloader::LockedPollRequests(std::unique_lock<std::mutex>& lock)
{
if (m_pending_http_requests.empty())
Expand Down
2 changes: 2 additions & 0 deletions src/common/http_downloader.h
Expand Up @@ -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();

Expand Down
15 changes: 14 additions & 1 deletion src/frontend-common/achievements.cpp
Expand Up @@ -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)
Expand Down Expand Up @@ -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();
Expand All @@ -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)
{
Expand Down

0 comments on commit aee8163

Please sign in to comment.