From 44e66937c62fd3e3eb5d5abc81660bccf1b721bb Mon Sep 17 00:00:00 2001 From: casey langen Date: Wed, 16 Dec 2020 17:18:47 -0800 Subject: [PATCH] Fixed update check (and an HttpClient re-entrancy issue) --- src/musikcore/sdk/HttpClient.h | 28 +++++++++++++------------- src/musikcube/app/util/UpdateCheck.cpp | 1 + 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/musikcore/sdk/HttpClient.h b/src/musikcore/sdk/HttpClient.h index 4452d2d64..5154854bc 100644 --- a/src/musikcore/sdk/HttpClient.h +++ b/src/musikcore/sdk/HttpClient.h @@ -96,7 +96,7 @@ namespace musik { namespace core { namespace sdk { void RunOnCurrentThread(Callback callback); - std::mutex mutex; + std::recursive_mutex mutex; std::shared_ptr thread; T ostream; @@ -217,7 +217,7 @@ namespace musik { namespace core { namespace sdk { template HttpClient::~HttpClient() { - std::unique_lock lock(this->mutex); + std::unique_lock lock(this->mutex); if (this->curl) { curl_easy_cleanup(this->curl); @@ -231,7 +231,7 @@ namespace musik { namespace core { namespace sdk { template HttpClient& HttpClient::Run(Callback callback) { - std::unique_lock lock(this->mutex); + std::unique_lock lock(this->mutex); const std::string userAgent = this->userAgent.size() ? this->userAgent : DefaultUserAgent(); @@ -325,15 +325,21 @@ namespace musik { namespace core { namespace sdk { callback(this, httpStatus, curlCode); } - if (this->thread) { - this->thread->detach(); + std::shared_ptr oldThread = this->thread; + + { + std::unique_lock lock(this->mutex); this->thread.reset(); } + + if (oldThread) { + oldThread->detach(); + } } template void HttpClient::Wait() { - std::unique_lock lock(this->mutex); + std::unique_lock lock(this->mutex); if (this->thread && this->thread->joinable()) { this->thread->join(); @@ -396,14 +402,8 @@ namespace musik { namespace core { namespace sdk { template void HttpClient::Cancel() { - std::unique_lock lock(this->mutex); - - if (this->thread) { - this->cancel = true; - if (this->thread->joinable()) { - this->thread->join(); - } - } + std::unique_lock lock(this->mutex); + this->cancel = true; } } } } diff --git a/src/musikcube/app/util/UpdateCheck.cpp b/src/musikcube/app/util/UpdateCheck.cpp index 0aa80a412..ac9d835ef 100644 --- a/src/musikcube/app/util/UpdateCheck.cpp +++ b/src/musikcube/app/util/UpdateCheck.cpp @@ -107,6 +107,7 @@ bool UpdateCheck::Run(Callback callback) { this->Reset(); + this->callback = callback; this->httpClient = HttpClient::Create(std::stringstream()); this->httpClient->Url(UPDATE_CHECK_URL) .UserAgent(getUserAgent())