From c7a94a80dfbc36f21d726a7c89f47ebc5c166394 Mon Sep 17 00:00:00 2001 From: Eladash <18193363+elad335@users.noreply.github.com> Date: Sat, 20 Jan 2024 10:23:47 +0200 Subject: [PATCH] Savestates/net: fix P2P socket data saving --- rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.cpp | 4 ++-- rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2p.cpp | 14 ++++++-------- rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_raw.cpp | 4 ++-- rpcs3/util/types.hpp | 6 ++++++ 4 files changed, 16 insertions(+), 12 deletions(-) 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 34ce038fd4..9ffd03cc9a 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.cpp @@ -20,7 +20,7 @@ lv2_socket_native::lv2_socket_native(lv2_socket_family family, lv2_socket_type t } lv2_socket_native::lv2_socket_native(utils::serial& ar, lv2_socket_type type) - : lv2_socket(ar, type) + : lv2_socket(stx::make_exact(ar), type) { #ifdef _WIN32 ar(so_reuseaddr, so_reuseport); @@ -37,7 +37,7 @@ lv2_socket_native::lv2_socket_native(utils::serial& ar, lv2_socket_type type) void lv2_socket_native::save(utils::serial& ar) { - static_cast(this)->save(ar, true); + lv2_socket::save(ar, true); #ifdef _WIN32 ar(so_reuseaddr, so_reuseport); #else diff --git a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2p.cpp b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2p.cpp index 4c02b89cdd..6c7df86c09 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2p.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2p.cpp @@ -12,30 +12,28 @@ lv2_socket_p2p::lv2_socket_p2p(lv2_socket_family family, lv2_socket_type type, l } lv2_socket_p2p::lv2_socket_p2p(utils::serial& ar, lv2_socket_type type) - : lv2_socket(ar, type) + : lv2_socket(stx::make_exact(ar), type) { ar(port, vport, bound_addr); - std::deque>> data_dequeue{ar}; + auto data_dequeue = ar.pop>>>(); for (; !data_dequeue.empty(); data_dequeue.pop_front()) { - data.push(data_dequeue.front()); + data.push(std::move(data_dequeue.front())); } - - ar(data_dequeue); } void lv2_socket_p2p::save(utils::serial& ar) { - static_cast(this)->save(ar, true); + lv2_socket::save(ar, true); ar(port, vport, bound_addr); std::deque>> data_dequeue; - for (; !data.empty(); data.pop()) + for (auto save_data = ::as_rvalue(data); !save_data.empty(); save_data.pop()) { - data_dequeue.push_back(data.front()); + data_dequeue.push_back(std::move(save_data.front())); } ar(data_dequeue); diff --git a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_raw.cpp b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_raw.cpp index aee50f5c58..537a5e7c24 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_raw.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_raw.cpp @@ -10,13 +10,13 @@ lv2_socket_raw::lv2_socket_raw(lv2_socket_family family, lv2_socket_type type, l } lv2_socket_raw::lv2_socket_raw(utils::serial& ar, lv2_socket_type type) - : lv2_socket(ar, type) + : lv2_socket(stx::make_exact(ar), type) { } void lv2_socket_raw::save(utils::serial& ar) { - static_cast(this)->save(ar, true); + lv2_socket::save(ar, true); } std::tuple, sys_net_sockaddr> lv2_socket_raw::accept([[maybe_unused]] bool is_lock) diff --git a/rpcs3/util/types.hpp b/rpcs3/util/types.hpp index d3e8e7a8bb..dd90e0dda1 100644 --- a/rpcs3/util/types.hpp +++ b/rpcs3/util/types.hpp @@ -1203,6 +1203,12 @@ namespace stx template requires (std::is_same_v && std::is_copy_constructible_v) operator U() const noexcept { return obj; }; }; + + template + stx::exact_t make_exact(T&& obj) noexcept + { + return stx::exact_t(static_cast(obj)); + } } // Read object of type T from raw pointer, array, string, vector, or any contiguous container