diff --git a/rpcs3/Emu/Cell/PPUModule.cpp b/rpcs3/Emu/Cell/PPUModule.cpp index 430338662b..4aa5146b09 100644 --- a/rpcs3/Emu/Cell/PPUModule.cpp +++ b/rpcs3/Emu/Cell/PPUModule.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include "util/asm.hpp" LOG_CHANNEL(ppu_loader); @@ -143,15 +144,16 @@ struct ppu_linkage_info }; // FNID -> (export; [imports...]) - std::unordered_map> functions{}; - std::unordered_map> variables{}; + std::map functions{}; + std::map variables{}; // Obsolete bool imported = false; }; // Module map - std::unordered_map modules{}; + std::map modules{}; + shared_mutex mutex; }; // Initialize static modules. @@ -631,6 +633,8 @@ static auto ppu_load_exports(ppu_linkage_info* link, u32 exports_start, u32 expo { std::unordered_map result; + std::lock_guard lock(link->mutex); + for (u32 addr = exports_start; addr < exports_end;) { const auto& lib = vm::_ref(addr); @@ -777,6 +781,8 @@ static auto ppu_load_imports(std::vector& relocs, ppu_linkage_info* l { std::unordered_map result; + reader_lock lock(link->mutex); + for (u32 addr = imports_start; addr < imports_end;) { const auto& lib = vm::_ref(addr); @@ -1498,9 +1504,16 @@ std::shared_ptr ppu_load_prx(const ppu_prx_object& elf, const std::stri void ppu_unload_prx(const lv2_prx& prx) { + std::unique_lock lock(g_fxo->get().mutex, std::defer_lock); + // Clean linkage info for (auto& imp : prx.imports) { + if (!lock) + { + lock.lock(); + } + auto pinfo = static_cast(imp.second); pinfo->frefss.erase(imp.first); pinfo->imports.erase(imp.first); @@ -1523,6 +1536,11 @@ void ppu_unload_prx(const lv2_prx& prx) // } //} + if (lock) + { + lock.unlock(); + } + if (prx.path.ends_with("sys/external/liblv2.sprx"sv)) { liblv2_begin = 0;