From ada6db2df464a8f7b1b94ba515ec2d45fb8db6b6 Mon Sep 17 00:00:00 2001 From: Bevan Weiss Date: Thu, 6 Aug 2020 20:34:08 +1000 Subject: [PATCH] Replace ppu_module_manager Function Static with Class Static variable (static module map) (#8669) * Replace ppu_module_manager Function Static with Class Static Makes for a slightly 'cleaner' interface in my opinion, may also assist with adding thread read/write concurrency support in future if ever required (have left that out of this commit to match existing function). Very slight performance improvements were seen in representative testing. https://quick-bench.com/q/GMbgeNc-mZc21aqOKCofnbzPZvg I didn't investigate whether static initialisation of the static_modules might actually be possible here, perhaps there's a way to do a constexpr / consteval of this. * Fix up for old style cast syntax.. * Fixups from PR comments Plus remove spurious type_traits include (from me) not picked up in previous PR * Remove old code * Update rpcs3/Emu/Cell/PPUModule.h Co-authored-by: Eladash * Fix naming of static variable Co-authored-by: Eladash --- rpcs3/Emu/Cell/PPUModule.cpp | 15 ++++----------- rpcs3/Emu/Cell/PPUModule.h | 10 ++++++---- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/rpcs3/Emu/Cell/PPUModule.cpp b/rpcs3/Emu/Cell/PPUModule.cpp index 1becdbbc5d..9d8f864fb0 100644 --- a/rpcs3/Emu/Cell/PPUModule.cpp +++ b/rpcs3/Emu/Cell/PPUModule.cpp @@ -61,21 +61,14 @@ ppu_static_module::ppu_static_module(const char* name) ppu_module_manager::register_module(this); } -std::unordered_map& ppu_module_manager::access() -{ - static std::unordered_map map; - - return map; -} - void ppu_module_manager::register_module(ppu_static_module* _module) { - access().emplace(_module->name, _module); + ppu_module_manager::s_module_map.emplace(_module->name, _module); } ppu_static_function& ppu_module_manager::access_static_function(const char* _module, u32 fnid) { - auto& res = access().at(_module)->functions[fnid]; + auto& res = ppu_module_manager::s_module_map.at(_module)->functions[fnid]; if (res.name) { @@ -87,7 +80,7 @@ ppu_static_function& ppu_module_manager::access_static_function(const char* _mod ppu_static_variable& ppu_module_manager::access_static_variable(const char* _module, u32 vnid) { - auto& res = access().at(_module)->variables[vnid]; + auto& res = ppu_module_manager::s_module_map.at(_module)->variables[vnid]; if (res.name) { @@ -99,7 +92,7 @@ ppu_static_variable& ppu_module_manager::access_static_variable(const char* _mod const ppu_static_module* ppu_module_manager::get_module(const std::string& name) { - const auto& map = access(); + const auto& map = ppu_module_manager::s_module_map; const auto found = map.find(name); return found != map.end() ? found->second : nullptr; } diff --git a/rpcs3/Emu/Cell/PPUModule.h b/rpcs3/Emu/Cell/PPUModule.h index 0bd9bf88af..105a2c592e 100644 --- a/rpcs3/Emu/Cell/PPUModule.h +++ b/rpcs3/Emu/Cell/PPUModule.h @@ -101,8 +101,6 @@ class ppu_module_manager final { friend class ppu_static_module; - static std::unordered_map& access(); - static void register_module(ppu_static_module*); static ppu_static_function& access_static_function(const char* _module, u32 fnid); @@ -161,9 +159,10 @@ public: return info; } - static const auto& get() + // We need this to deal with the enumeration over all ppu_static_modules that happens in ppu_initialize_modules + static const std::unordered_map& get() { - return access(); + return s_module_map; } static const ppu_static_module cellAdec; @@ -273,6 +272,9 @@ public: static const ppu_static_module sys_libc; static const ppu_static_module sys_lv2dbg; static const ppu_static_module static_hle; + +private: + inline static std::unordered_map s_module_map; }; template