From 673182f608109ad4eebe0aa57f8a6d050d88eae8 Mon Sep 17 00:00:00 2001 From: digant Date: Fri, 27 Dec 2024 23:53:46 +0100 Subject: [PATCH] update --- Utilities/StrFmt.cpp | 2 +- rpcs3/Emu/Cell/Modules/cellGem.cpp | 4 ---- rpcs3/Emu/Cell/PPUAnalyser.h | 4 ++++ rpcs3/Emu/Cell/lv2/sys_net/lv2_socket.cpp | 3 +++ rpcs3/Emu/Cell/lv2/sys_net/lv2_socket.h | 2 +- rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.cpp | 5 +++++ rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.h | 1 + rpcs3/Emu/Memory/vm.cpp | 3 +-- rpcs3/Emu/savestate_utils.cpp | 4 ++-- rpcs3/util/serialization.hpp | 16 +++++++++++----- rpcs3/util/shared_ptr.hpp | 13 ++++--------- 11 files changed, 33 insertions(+), 24 deletions(-) diff --git a/Utilities/StrFmt.cpp b/Utilities/StrFmt.cpp index e2c2198bdc..dd59303337 100644 --- a/Utilities/StrFmt.cpp +++ b/Utilities/StrFmt.cpp @@ -596,7 +596,7 @@ void fmt_class_string::format(std::string& out, u64 arg) } } - func = func.substr(0, index); + func = func.substr(0, index) + "()"; break; } diff --git a/rpcs3/Emu/Cell/Modules/cellGem.cpp b/rpcs3/Emu/Cell/Modules/cellGem.cpp index 57858dd3b3..f7d274c4d0 100644 --- a/rpcs3/Emu/Cell/Modules/cellGem.cpp +++ b/rpcs3/Emu/Cell/Modules/cellGem.cpp @@ -479,10 +479,6 @@ public: gem_config_data(utils::serial& ar) { save(ar); - - if (ar.is_writing()) - return; - load_configs(); } diff --git a/rpcs3/Emu/Cell/PPUAnalyser.h b/rpcs3/Emu/Cell/PPUAnalyser.h index 87a6de04d7..9d6f4ef9ed 100644 --- a/rpcs3/Emu/Cell/PPUAnalyser.h +++ b/rpcs3/Emu/Cell/PPUAnalyser.h @@ -186,6 +186,10 @@ struct main_ppu_module : public ppu_module u32 elf_entry{}; u32 seg0_code_end{}; std::vector applied_patches; + + // Disable inherited savestate ordering + void save(utils::serial&) = delete; + static constexpr double savestate_init_pos = double{}; }; // Aux diff --git a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket.cpp b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket.cpp index 0e1543157c..d95c6935fc 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket.cpp @@ -186,3 +186,6 @@ lv2_socket& lv2_socket::operator=(thread_state s) noexcept return *this; } +lv2_socket::~lv2_socket() noexcept +{ +} diff --git a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket.h b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket.h index 4703f31d5f..f0e3b61d00 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket.h +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket.h @@ -64,7 +64,7 @@ public: lv2_socket(utils::serial&, lv2_socket_type type); static std::function load(utils::serial& ar); void save(utils::serial&, bool save_only_this_class = false); - ~lv2_socket() noexcept = default; + virtual ~lv2_socket() noexcept; lv2_socket& operator=(thread_state s) noexcept; std::unique_lock lock(); diff --git a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.cpp b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.cpp index 75fd375e5a..d0a735b178 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.cpp @@ -57,6 +57,11 @@ void lv2_socket_native::save(utils::serial& ar) ar(is_socket_connected()); } +lv2_socket_native::~lv2_socket_native() noexcept +{ + lv2_socket_native::close(); +} + s32 lv2_socket_native::create_socket() { ensure(family == SYS_NET_AF_INET); diff --git a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.h b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.h index e9a2b21bb6..808529356a 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.h +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.h @@ -34,6 +34,7 @@ public: lv2_socket_native(lv2_socket_family family, lv2_socket_type type, lv2_ip_protocol protocol); lv2_socket_native(utils::serial& ar, lv2_socket_type type); + ~lv2_socket_native() noexcept override; void save(utils::serial& ar); s32 create_socket(); diff --git a/rpcs3/Emu/Memory/vm.cpp b/rpcs3/Emu/Memory/vm.cpp index 446d8d98a3..6ab0ecc71d 100644 --- a/rpcs3/Emu/Memory/vm.cpp +++ b/rpcs3/Emu/Memory/vm.cpp @@ -1749,8 +1749,7 @@ namespace vm if (is_memory_compatible_for_copy_from_executable_optimization(addr, shm.first)) { // Revert changes - ar.data.resize(ar.data.size() - (sizeof(u32) * 2 + sizeof(memory_page))); - ar.seek_end(); + ar.trunc(sizeof(u32) * 2 + sizeof(memory_page)); vm_log.success("Removed memory block matching the memory of the executable from savestate. (addr=0x%x, size=0x%x)", addr, shm.first); continue; } diff --git a/rpcs3/Emu/savestate_utils.cpp b/rpcs3/Emu/savestate_utils.cpp index 790da3b035..85a2a82574 100644 --- a/rpcs3/Emu/savestate_utils.cpp +++ b/rpcs3/Emu/savestate_utils.cpp @@ -42,7 +42,7 @@ static std::array s_serial_versions; return ::s_serial_versions[identifier].current_version;\ } -SERIALIZATION_VER(global_version, 0, 18) // For stuff not listed here +SERIALIZATION_VER(global_version, 0, 19) // For stuff not listed here SERIALIZATION_VER(ppu, 1, 1, 2/*PPU sleep order*/, 3/*PPU FNID and module*/) SERIALIZATION_VER(spu, 2, 1) SERIALIZATION_VER(lv2_sync, 3, 1) @@ -393,7 +393,7 @@ namespace stx if ((saved ^ tag) & data_mask) { ensure(!ar.is_writing()); - fmt::throw_exception("serial_breathe_and_tag(%u): %s, object: '%s', next-object: '%s', expected/tag: 0x%x != 0x%x,", s_tls_call_count, ar, s_tls_object_name, name, tag, saved); + fmt::throw_exception("serial_breathe_and_tag(%u): %s\nobject: '%s', next-object: '%s', expected/tag: 0x%x != 0x%x,", s_tls_call_count, ar, s_tls_object_name, name, tag, saved); } s_tls_object_name = name; diff --git a/rpcs3/util/serialization.hpp b/rpcs3/util/serialization.hpp index bcc0fe8d97..120c70c606 100644 --- a/rpcs3/util/serialization.hpp +++ b/rpcs3/util/serialization.hpp @@ -108,10 +108,10 @@ public: { if (m_is_writing) return; - const u32 offset1 = ::offset32(first) + sizeof(first); + const u32 offset1 = ::offset32(first) + sizeof(T); const u32 offset2 = ::offset32(second); - AUDIT(offset2 >= offset1); + AUDIT(::offset32(first) <= ::offset32(second)); if (offset2 > offset1) { @@ -459,10 +459,16 @@ public: m_file_handler.reset(); } - usz seek_end(usz backwards = 0) + usz seek_end() { - ensure(data.size() + data_offset >= backwards); - pos = data.size() + data_offset - backwards; + pos = data.size() + data_offset; + return pos; + } + + usz trunc(usz count) + { + data.resize(data.size() - count); + seek_end(); return pos; } diff --git a/rpcs3/util/shared_ptr.hpp b/rpcs3/util/shared_ptr.hpp index 7685cfda91..06f1d2a380 100644 --- a/rpcs3/util/shared_ptr.hpp +++ b/rpcs3/util/shared_ptr.hpp @@ -451,23 +451,18 @@ namespace stx } } - // Converts to unique (single) ptr if reference is 1, otherwise returns null. Nullifies self. + // Converts to unique (single) ptr if reference is 1. Nullifies self on success. template requires PtrSame - explicit operator single_ptr() && noexcept + single_ptr try_convert_to_single_ptr() noexcept { - const auto o = d(); - - if (m_ptr && !--o->refs) + if (const auto o = m_ptr ? d() : nullptr; o && o->refs == 1u) { // Convert last reference to single_ptr instance. - o->refs.release(1); - single_ptr r; + single_ptr r; r.m_ptr = static_cast(std::exchange(m_ptr, nullptr)); return r; } - // Otherwise, both pointers are gone. Didn't seem right to do it in the constructor. - m_ptr = nullptr; return {}; }