diff --git a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket.cpp b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket.cpp index 011bc4e8f8..0e1543157c 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket.cpp @@ -175,3 +175,14 @@ void lv2_socket::queue_wake(ppu_thread* ppu) break; } } + +lv2_socket& lv2_socket::operator=(thread_state s) noexcept +{ + if (s == thread_state::finished) + { + close(); + } + + return *this; +} + diff --git a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket.h b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket.h index 4cbab143dc..4703f31d5f 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket.h +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket.h @@ -27,6 +27,8 @@ using socket_type = uptr; using socket_type = int; #endif +enum class thread_state : u32; + class lv2_socket { public: @@ -62,7 +64,8 @@ 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); - virtual ~lv2_socket() = default; + ~lv2_socket() noexcept = default; + 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 b8398480cb..75fd375e5a 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.cpp @@ -57,19 +57,6 @@ void lv2_socket_native::save(utils::serial& ar) ar(is_socket_connected()); } -lv2_socket_native::~lv2_socket_native() -{ - std::lock_guard lock(mutex); - if (socket) - { -#ifdef _WIN32 - ::closesocket(socket); -#else - ::close(socket); -#endif - } -} - s32 lv2_socket_native::create_socket() { ensure(family == SYS_NET_AF_INET); @@ -1114,10 +1101,12 @@ void lv2_socket_native::close() socket = {}; } - auto& dnshook = g_fxo->get(); - dnshook.remove_dns_spy(lv2_id); + if (auto dnshook = g_fxo->try_get()) + { + dnshook->remove_dns_spy(lv2_id); + } - if (bound_port) + if (bound_port && g_fxo->is_init>()) { auto& nph = g_fxo->get>(); nph.upnp_remove_port_mapping(bound_port, type == SYS_NET_SOCK_STREAM ? "TCP" : "UDP"); 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 08a1f4575a..e9a2b21bb6 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.h +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.h @@ -35,7 +35,6 @@ 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); void save(utils::serial& ar); - ~lv2_socket_native(); s32 create_socket(); std::tuple, sys_net_sockaddr> accept(bool is_lock = true) override; 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 a4228a0322..8614d37205 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2p.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2p.cpp @@ -330,8 +330,9 @@ void lv2_socket_p2p::close() return; } - auto& nc = g_fxo->get(); + if (g_fxo->is_init()) { + auto& nc = g_fxo->get(); std::lock_guard lock(nc.list_p2p_ports_mutex); if (!nc.list_p2p_ports.contains(port)) diff --git a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2ps.cpp b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2ps.cpp index a363301dc2..d6c98b670a 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2ps.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2ps.cpp @@ -944,8 +944,9 @@ void lv2_socket_p2ps::close() return; } - auto& nc = g_fxo->get(); + if (g_fxo->is_init()) { + auto& nc = g_fxo->get(); std::lock_guard lock(nc.list_p2p_ports_mutex); auto& p2p_port = ::at32(nc.list_p2p_ports, port); { @@ -973,8 +974,10 @@ void lv2_socket_p2ps::close() } } - auto& tcpm = g_fxo->get>(); - tcpm.clear_all_messages(lv2_id); + if (const auto tcpm = g_fxo->try_get>()) + { + tcpm->clear_all_messages(lv2_id); + } } s32 lv2_socket_p2ps::shutdown([[maybe_unused]] s32 how)