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)