summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorGravatar yzct123452021-08-13 18:39:45 +0000
committerGravatar GitHub2021-08-13 18:39:45 +0000
commit001675dced1b7b751d1db4f0d6490776c613df2f (patch)
tree151923c90c42bdcede2581ddf6b56768bfcafc01 /src/core
parentMerge pull request #6862 from german77/badsdl (diff)
downloadyuzu-001675dced1b7b751d1db4f0d6490776c613df2f.tar.gz
yuzu-001675dced1b7b751d1db4f0d6490776c613df2f.tar.xz
yuzu-001675dced1b7b751d1db4f0d6490776c613df2f.zip
logging: Simplify and make thread-safe
This simplifies the logging system. This also fixes some lost messages on startup. The simplification is simple. I removed unused functions and moved most things in the .h to the .cpp. I replaced the unnecessary linked list with its contents laid out as three member variables. Anything that went through the linked list now directly accesses the backends. Generic functions are replaced with those for each specific use case and there aren't many. This change increases coupling but we gain back more KISS and encapsulation. With those changes it was easy to make it thread-safe. I just removed the mutex and turned a boolean atomic. I was planning to use this thread-safety in my next PR about stacktraces. It was actually async-signal-safety at first but I ended up using a different approach. Anyway getting rid of the linked list is important for that because have the list of backends constantly changing complicates things.
Diffstat (limited to 'src/core')
-rw-r--r--src/core/core.cpp9
-rw-r--r--src/core/core.h9
2 files changed, 14 insertions, 4 deletions
diff --git a/src/core/core.cpp b/src/core/core.cpp
index d3e84c4ef..0d3c4182a 100644
--- a/src/core/core.cpp
+++ b/src/core/core.cpp
@@ -84,8 +84,6 @@ FileSys::StorageId GetStorageIdForFrontendSlot(
84 84
85} // Anonymous namespace 85} // Anonymous namespace
86 86
87/*static*/ System System::s_instance;
88
89FileSys::VirtualFile GetGameFileFromPath(const FileSys::VirtualFilesystem& vfs, 87FileSys::VirtualFile GetGameFileFromPath(const FileSys::VirtualFilesystem& vfs,
90 const std::string& path) { 88 const std::string& path) {
91 // To account for split 00+01+etc files. 89 // To account for split 00+01+etc files.
@@ -425,6 +423,13 @@ struct System::Impl {
425System::System() : impl{std::make_unique<Impl>(*this)} {} 423System::System() : impl{std::make_unique<Impl>(*this)} {}
426System::~System() = default; 424System::~System() = default;
427 425
426void System::InitializeGlobalInstance() {
427 if (s_instance) {
428 abort();
429 }
430 s_instance = std::unique_ptr<System>(new System);
431}
432
428CpuManager& System::GetCpuManager() { 433CpuManager& System::GetCpuManager() {
429 return impl->cpu_manager; 434 return impl->cpu_manager;
430} 435}
diff --git a/src/core/core.h b/src/core/core.h
index ea143043c..85836f2f8 100644
--- a/src/core/core.h
+++ b/src/core/core.h
@@ -121,9 +121,14 @@ public:
121 * @returns Reference to the instance of the System singleton class. 121 * @returns Reference to the instance of the System singleton class.
122 */ 122 */
123 [[deprecated("Use of the global system instance is deprecated")]] static System& GetInstance() { 123 [[deprecated("Use of the global system instance is deprecated")]] static System& GetInstance() {
124 return s_instance; 124 if (!s_instance) {
125 abort();
126 }
127 return *s_instance;
125 } 128 }
126 129
130 static void InitializeGlobalInstance();
131
127 /// Enumeration representing the return values of the System Initialize and Load process. 132 /// Enumeration representing the return values of the System Initialize and Load process.
128 enum class ResultStatus : u32 { 133 enum class ResultStatus : u32 {
129 Success, ///< Succeeded 134 Success, ///< Succeeded
@@ -396,7 +401,7 @@ private:
396 struct Impl; 401 struct Impl;
397 std::unique_ptr<Impl> impl; 402 std::unique_ptr<Impl> impl;
398 403
399 static System s_instance; 404 inline static std::unique_ptr<System> s_instance{};
400}; 405};
401 406
402} // namespace Core 407} // namespace Core