Revert "Android: Don't hold gameFileCache lock during updateAdditionalMetadata"
This reverts commitfb265b610d. The optimization in that commit is safe when the executor thread is writing and the GUI thread is reading, but I had failed to take into account that it's unsafe when the GUI thread is writing and the executor thread is reading. (The native UpdateAdditionalMetadata function loops through m_cached_files, which is unsafe if another thread is adding elements to m_cached_files simultaneously.) Losing out on this optimization isn't too bad, because719930bb39makes it very unlikely that both threads will want the lock at the same time.
This commit is contained in:
+2
-3
@@ -227,11 +227,9 @@ public final class GameFileCacheManager
|
|||||||
{
|
{
|
||||||
String[] gamePaths = GameFileCache.getAllGamePaths();
|
String[] gamePaths = GameFileCache.getAllGamePaths();
|
||||||
|
|
||||||
boolean changed;
|
|
||||||
synchronized (sGameFileCache)
|
synchronized (sGameFileCache)
|
||||||
{
|
{
|
||||||
changed = sGameFileCache.update(gamePaths);
|
boolean changed = sGameFileCache.update(gamePaths);
|
||||||
}
|
|
||||||
if (changed)
|
if (changed)
|
||||||
{
|
{
|
||||||
updateGameFileArray();
|
updateGameFileArray();
|
||||||
@@ -248,6 +246,7 @@ public final class GameFileCacheManager
|
|||||||
sGameFileCache.save();
|
sGameFileCache.save();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
sRescanInProgress.postValue(false);
|
sRescanInProgress.postValue(false);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,8 +13,6 @@ if(CMAKE_SYSTEM_NAME MATCHES "Windows")
|
|||||||
add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
|
add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
|
||||||
add_definitions(-D_CRT_NONSTDC_NO_WARNINGS)
|
add_definitions(-D_CRT_NONSTDC_NO_WARNINGS)
|
||||||
add_definitions(-D_SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING)
|
add_definitions(-D_SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING)
|
||||||
# The replacement for the old atomic shared_ptr functions was added in C++20, so we can't use it yet
|
|
||||||
add_definitions(-D_SILENCE_CXX20_OLD_SHARED_PTR_ATOMIC_SUPPORT_DEPRECATION_WARNING)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (NOT MSVC)
|
if (NOT MSVC)
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
#include "UICommon/GameFileCache.h"
|
#include "UICommon/GameFileCache.h"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <atomic>
|
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <list>
|
#include <list>
|
||||||
@@ -204,7 +203,7 @@ bool GameFileCache::UpdateAdditionalMetadata(std::shared_ptr<GameFile>* game_fil
|
|||||||
if (custom_cover_changed)
|
if (custom_cover_changed)
|
||||||
copy->CustomCoverCommit();
|
copy->CustomCoverCommit();
|
||||||
|
|
||||||
std::atomic_store(game_file, std::move(copy));
|
*game_file = std::move(copy);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,8 +29,6 @@
|
|||||||
<PreprocessorDefinitions>_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<!--Currently needed for some code in StringUtil used only on Android-->
|
<!--Currently needed for some code in StringUtil used only on Android-->
|
||||||
<PreprocessorDefinitions>_SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>_SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<!--The replacement for the old atomic shared_ptr functions was added in C++20, so we can't use it yet-->
|
|
||||||
<PreprocessorDefinitions>_SILENCE_CXX20_OLD_SHARED_PTR_ATOMIC_SUPPORT_DEPRECATION_WARNING;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
|
|
||||||
<!--Dolphin-specific definitions-->
|
<!--Dolphin-specific definitions-->
|
||||||
<PreprocessorDefinitions Condition="'$(Platform)'=='x64'">_ARCH_64=1;_M_X86=1;_M_X86_64=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions Condition="'$(Platform)'=='x64'">_ARCH_64=1;_M_X86=1;_M_X86_64=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
|||||||
Reference in New Issue
Block a user