diff --git a/Common/GPU/thin3d.cpp b/Common/GPU/thin3d.cpp index 312bd91312..fd5d056e7c 100644 --- a/Common/GPU/thin3d.cpp +++ b/Common/GPU/thin3d.cpp @@ -69,30 +69,20 @@ bool DataFormatIsDepthStencil(DataFormat fmt) { bool RefCountedObject::Release() { if (refcount_ > 0 && refcount_ < 10000) { - refcount_--; - if (refcount_ == 0) { + if (--refcount_ == 0) { delete this; return true; } - } - else { - _dbg_assert_msg_(false, "Refcount (%d) invalid for object %p - corrupt?", refcount_, this); + } else { + _dbg_assert_msg_(false, "Refcount (%d) invalid for object %p - corrupt?", refcount_.load(), this); } return false; } bool RefCountedObject::ReleaseAssertLast() { - _dbg_assert_msg_(refcount_ == 1, "RefCountedObject: Expected to be the last reference, but isn't!"); - if (refcount_ > 0 && refcount_ < 10000) { - refcount_--; - if (refcount_ == 0) { - delete this; - return true; - } - } else { - ERROR_LOG(G3D, "Refcount (%d) invalid for object %p - corrupt?", refcount_, this); - } - return false; + bool released = Release(); + _dbg_assert_msg_(released, "RefCountedObject: Expected to be the last reference, but isn't!"); + return released; } diff --git a/Common/GPU/thin3d.h b/Common/GPU/thin3d.h index f3454df2e7..023098405c 100644 --- a/Common/GPU/thin3d.h +++ b/Common/GPU/thin3d.h @@ -6,6 +6,7 @@ #pragma once +#include #include #include #include @@ -324,7 +325,9 @@ protected: class RefCountedObject { public: - RefCountedObject() : refcount_(1) {} + RefCountedObject() { + refcount_ = 1; + } virtual ~RefCountedObject() {} void AddRef() { refcount_++; } @@ -332,7 +335,7 @@ public: bool ReleaseAssertLast(); private: - int refcount_; + std::atomic refcount_; }; template diff --git a/Common/Net/HTTPClient.cpp b/Common/Net/HTTPClient.cpp index 142f41426d..fec31dabb8 100644 --- a/Common/Net/HTTPClient.cpp +++ b/Common/Net/HTTPClient.cpp @@ -597,9 +597,10 @@ std::shared_ptr Downloader::StartDownloadWithCallback( void Downloader::Update() { restart: for (size_t i = 0; i < downloads_.size(); i++) { - if (downloads_[i]->Progress() == 1.0f || downloads_[i]->Failed()) { - downloads_[i]->RunCallback(); - downloads_[i]->Join(); + auto &dl = downloads_[i]; + if (dl->Done()) { + dl->RunCallback(); + dl->Join(); downloads_.erase(downloads_.begin() + i); goto restart; }