diff --git a/Source/Core/Common/Common.vcxproj b/Source/Core/Common/Common.vcxproj index fe95d75289eb..c81bb3ab0456 100644 --- a/Source/Core/Common/Common.vcxproj +++ b/Source/Core/Common/Common.vcxproj @@ -108,6 +108,7 @@ + diff --git a/Source/Core/Common/Common.vcxproj.filters b/Source/Core/Common/Common.vcxproj.filters index a55b5d26d64c..f9f84f8426a0 100644 --- a/Source/Core/Common/Common.vcxproj.filters +++ b/Source/Core/Common/Common.vcxproj.filters @@ -53,6 +53,7 @@ + diff --git a/Source/Core/Common/ScopeGuard.h b/Source/Core/Common/ScopeGuard.h new file mode 100644 index 000000000000..d61b9346f5e7 --- /dev/null +++ b/Source/Core/Common/ScopeGuard.h @@ -0,0 +1,47 @@ + +#pragma once + +#include + +namespace Common +{ + +class ScopeGuard final +{ +public: + template + ScopeGuard(Callable&& finalizer) : m_finalizer(std::forward(finalizer)) {} + + ScopeGuard(ScopeGuard&& other) : m_finalizer(std::move(other.m_finalizer)) + { + other.m_finalizer = nullptr; + } + + ~ScopeGuard() + { + Exit(); + } + + void Dismiss() + { + m_finalizer = nullptr; + } + + void Exit() + { + if (m_finalizer) + { + m_finalizer(); // must not throw + m_finalizer = nullptr; + } + } + + ScopeGuard(const ScopeGuard&) = delete; + + void operator=(const ScopeGuard&) = delete; + +private: + std::function m_finalizer; +}; + +} // Namespace Common diff --git a/Source/Core/Core/State.cpp b/Source/Core/Core/State.cpp index e2a110568fd0..e1c48ba541e0 100644 --- a/Source/Core/Core/State.cpp +++ b/Source/Core/Core/State.cpp @@ -9,6 +9,7 @@ #include "Common/CommonTypes.h" #include "Common/Event.h" +#include "Common/ScopeGuard.h" #include "Common/StringUtil.h" #include "Common/Thread.h" #include "Common/Timer.h" @@ -280,8 +281,13 @@ struct CompressAndDumpState_args static void CompressAndDumpState(CompressAndDumpState_args save_args) { std::lock_guard lk(*save_args.buffer_mutex); - if (!save_args.wait) + + Common::ScopeGuard on_exit([]() + { g_compressAndDumpStateSyncEvent.Set(); + }); + if (!save_args.wait) + on_exit.Exit(); const u8* const buffer_data = &(*(save_args.buffer_vector))[0]; const size_t buffer_size = (save_args.buffer_vector)->size(); @@ -313,7 +319,6 @@ static void CompressAndDumpState(CompressAndDumpState_args save_args) if (!f) { Core::DisplayMessage("Could not save state", 2000); - g_compressAndDumpStateSyncEvent.Set(); return; } @@ -361,7 +366,6 @@ static void CompressAndDumpState(CompressAndDumpState_args save_args) } Core::DisplayMessage(StringFromFormat("Saved State to %s", filename.c_str()), 2000); - g_compressAndDumpStateSyncEvent.Set(); } void SaveAs(const std::string& filename, bool wait)