diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index af3f78279e..8288f5abff 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -172,7 +172,7 @@ bool serialize(utils::serial& ar, typename ppu_thread::cr_b } extern void ppu_initialize(); -extern void ppu_finalize(const ppu_module& info); +extern void ppu_finalize(const ppu_module& info, bool force_mem_release = false); extern bool ppu_initialize(const ppu_module& info, bool check_only = false, u64 file_size = 0); static void ppu_initialize2(class jit_compiler& jit, const ppu_module& module_part, const std::string& cache_path, const std::string& obj_name, const ppu_module& whole_module); extern bool ppu_load_exec(const ppu_exec_object&, bool virtual_load, const std::string&, utils::serial* = nullptr); @@ -3706,22 +3706,32 @@ extern fs::file make_file_view(fs::file&& _file, u64 offset, u64 max_size = umax return file; } -extern void ppu_finalize(const ppu_module& info) +extern void ppu_finalize(const ppu_module& info, bool force_mem_release) { - if (info.name.empty()) + if (!force_mem_release && info.name.empty()) { // Don't remove main module from memory return; } - const std::string dev_flash = vfs::get("/dev_flash/sys/"); - - if (info.path.starts_with(dev_flash) || Emu.GetCat() == "1P") + if (!force_mem_release && Emu.GetCat() == "1P") { - // Don't remove dev_flash prx from memory return; } + const bool may_be_elf = fmt::to_lower(info.path.substr(std::max(info.path.size(), 3) - 3)) != "prx"; + + if (!may_be_elf) + { + const std::string dev_flash = vfs::get("/dev_flash/sys/external"); + + if (!force_mem_release && info.path.starts_with(dev_flash)) + { + // Don't remove dev_flash prx from memory + return; + } + } + // Get cache path for this executable std::string cache_path = fs::get_cache_dir() + "cache/"; @@ -3960,7 +3970,10 @@ extern void ppu_precompile(std::vector& dir_queue, std::vector ovl_sema; - named_thread_group workers("SPRX Worker ", std::min(utils::get_thread_count(), ::size32(file_queue)), [&] + const u32 software_thread_limit = std::min(g_cfg.core.llvm_threads ? g_cfg.core.llvm_threads : u32{umax}, ::size32(file_queue)); + const u32 cpu_thread_limit = utils::get_thread_count() > 8u ? std::max(utils::get_thread_count(), 2) - 1 : utils::get_thread_count(); // One LLVM thread less + + named_thread_group workers("SPRX Worker ", std::min(software_thread_limit, cpu_thread_limit), [&] { #ifdef __APPLE__ pthread_jit_write_protect_np(false); @@ -4015,7 +4028,7 @@ extern void ppu_precompile(std::vector& dir_queue, std::vector& dir_queue, std::vector& dir_queue, std::vectorget() = std::move(current_cache); break; diff --git a/rpcs3/Emu/Cell/lv2/sys_overlay.cpp b/rpcs3/Emu/Cell/lv2/sys_overlay.cpp index c951239d7e..7a9cb08bf4 100644 --- a/rpcs3/Emu/Cell/lv2/sys_overlay.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_overlay.cpp @@ -16,7 +16,7 @@ extern std::pair, CellError> ppu_load_overlay(const ppu_exec_object&, bool virtual_load, const std::string& path, s64 file_offset, utils::serial* ar = nullptr); extern bool ppu_initialize(const ppu_module&, bool check_only = false, u64 file_size = 0); -extern void ppu_finalize(const ppu_module&); +extern void ppu_finalize(const ppu_module& info, bool force_mem_release = false); LOG_CHANNEL(sys_overlay); diff --git a/rpcs3/Emu/Cell/lv2/sys_prx.cpp b/rpcs3/Emu/Cell/lv2/sys_prx.cpp index 071290c595..affbb65dc7 100644 --- a/rpcs3/Emu/Cell/lv2/sys_prx.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_prx.cpp @@ -20,7 +20,7 @@ extern std::shared_ptr ppu_load_prx(const ppu_prx_object&, bool virtual_load, const std::string&, s64, utils::serial* = nullptr); extern void ppu_unload_prx(const lv2_prx& prx); extern bool ppu_initialize(const ppu_module&, bool check_only = false, u64 file_size = 0); -extern void ppu_finalize(const ppu_module&); +extern void ppu_finalize(const ppu_module& info, bool force_mem_release = false); extern void ppu_manual_load_imports_exports(u32 imports_start, u32 imports_size, u32 exports_start, u32 exports_size, std::basic_string& loaded_flags); LOG_CHANNEL(sys_prx);