Skip to content

Commit

Permalink
SaveState: Fix for race condition ("wait" didn't actually waited for …
Browse files Browse the repository at this point in the history
…file to flush/close).

g_compressAndDumpStateSyncEvent was Set() before destruction of file object (i.e. before flushing changes and closing file).

Also, adds Common::ScopeGuard wrapper for RAII.
  • Loading branch information
void-ghost committed Sep 26, 2015
1 parent a91810b commit 173df73
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 3 deletions.
1 change: 1 addition & 0 deletions Source/Core/Common/Common.vcxproj
Expand Up @@ -108,6 +108,7 @@
<ClInclude Include="Network.h" />
<ClInclude Include="PcapFile.h" />
<ClInclude Include="Profiler.h" />
<ClInclude Include="ScopeGuard.h" />
<ClInclude Include="SDCardUtil.h" />
<ClInclude Include="SettingsHandler.h" />
<ClInclude Include="StringUtil.h" />
Expand Down
1 change: 1 addition & 0 deletions Source/Core/Common/Common.vcxproj.filters
Expand Up @@ -53,6 +53,7 @@
<ClInclude Include="Network.h" />
<ClInclude Include="PcapFile.h" />
<ClInclude Include="Profiler.h" />
<ClInclude Include="ScopeGuard.h" />
<ClInclude Include="SDCardUtil.h" />
<ClInclude Include="SettingsHandler.h" />
<ClInclude Include="StringUtil.h" />
Expand Down
47 changes: 47 additions & 0 deletions Source/Core/Common/ScopeGuard.h
@@ -0,0 +1,47 @@

#pragma once

#include <functional>

namespace Common
{

class ScopeGuard final
{
public:
template<class Callable>
ScopeGuard(Callable&& finalizer) : m_finalizer(std::forward<Callable>(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<void()> m_finalizer;
};

} // Namespace Common
10 changes: 7 additions & 3 deletions Source/Core/Core/State.cpp
Expand Up @@ -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"
Expand Down Expand Up @@ -280,8 +281,13 @@ struct CompressAndDumpState_args
static void CompressAndDumpState(CompressAndDumpState_args save_args)
{
std::lock_guard<std::mutex> 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();
Expand Down Expand Up @@ -313,7 +319,6 @@ static void CompressAndDumpState(CompressAndDumpState_args save_args)
if (!f)
{
Core::DisplayMessage("Could not save state", 2000);
g_compressAndDumpStateSyncEvent.Set();
return;
}

Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit 173df73

Please sign in to comment.