summaryrefslogtreecommitdiff
path: root/Source/Core/Common/Config/Config.cpp
diff options
context:
space:
mode:
authorLéo Lam <leo@leolam.fr>2020-12-13 03:55:39 +0100
committerGitHub <noreply@github.com>2020-12-13 03:55:39 +0100
commit3634508e46d8db61b0c8dadb452f546f17ddd88e (patch)
tree8e39f4d692f80ce859a39919e3e028dbbfaec47c /Source/Core/Common/Config/Config.cpp
parentd31249593421dcdb4f6ef09485ec7e3e96cb4632 (diff)
parentd8744e6db8f97e4d721d098010d1b1115e31403f (diff)
Merge pull request #9311 from JosJuice/config-get-fast-2
Add caching to Config::Info
Diffstat (limited to 'Source/Core/Common/Config/Config.cpp')
-rw-r--r--Source/Core/Common/Config/Config.cpp21
1 files changed, 15 insertions, 6 deletions
diff --git a/Source/Core/Common/Config/Config.cpp b/Source/Core/Common/Config/Config.cpp
index 03c0aed72e..071d009b51 100644
--- a/Source/Core/Common/Config/Config.cpp
+++ b/Source/Core/Common/Config/Config.cpp
@@ -3,6 +3,7 @@
// Refer to the license.txt file included.
#include <algorithm>
+#include <atomic>
#include <list>
#include <map>
#include <mutex>
@@ -17,6 +18,7 @@ using Layers = std::map<LayerType, std::shared_ptr<Layer>>;
static Layers s_layers;
static std::list<ConfigChangedCallback> s_callbacks;
static u32 s_callback_guards = 0;
+static std::atomic<u64> s_config_version = 0;
static std::shared_mutex s_layers_rw_lock;
@@ -31,7 +33,7 @@ static void AddLayerInternal(std::shared_ptr<Layer> layer)
const Config::LayerType layer_type = layer->GetLayer();
s_layers.insert_or_assign(layer_type, std::move(layer));
}
- InvokeConfigChangedCallbacks();
+ OnConfigChanged();
}
void AddLayer(std::unique_ptr<ConfigLayerLoader> loader)
@@ -59,7 +61,7 @@ void RemoveLayer(LayerType layer)
s_layers.erase(layer);
}
- InvokeConfigChangedCallbacks();
+ OnConfigChanged();
}
void AddConfigChangedCallback(ConfigChangedCallback func)
@@ -67,15 +69,22 @@ void AddConfigChangedCallback(ConfigChangedCallback func)
s_callbacks.emplace_back(std::move(func));
}
-void InvokeConfigChangedCallbacks()
+void OnConfigChanged()
{
if (s_callback_guards)
return;
+ s_config_version.fetch_add(1, std::memory_order_relaxed);
+
for (const auto& callback : s_callbacks)
callback();
}
+u64 GetConfigVersion()
+{
+ return s_config_version.load(std::memory_order_relaxed);
+}
+
// Explicit load and save of layers
void Load()
{
@@ -85,7 +94,7 @@ void Load()
for (auto& layer : s_layers)
layer.second->Load();
}
- InvokeConfigChangedCallbacks();
+ OnConfigChanged();
}
void Save()
@@ -96,7 +105,7 @@ void Save()
for (auto& layer : s_layers)
layer.second->Save();
}
- InvokeConfigChangedCallbacks();
+ OnConfigChanged();
}
void Init()
@@ -207,7 +216,7 @@ ConfigChangeCallbackGuard::~ConfigChangeCallbackGuard()
if (--s_callback_guards)
return;
- InvokeConfigChangedCallbacks();
+ OnConfigChanged();
}
} // namespace Config