From 9657b3f1d4f2a4b5ea3cf874fee6ee28f8c051d1 Mon Sep 17 00:00:00 2001 From: Ani Date: Thu, 4 Jun 2020 17:30:11 +0100 Subject: [PATCH] Fix sys_net_bnet_poll regression (#8337) Co-authored-by: Eladash --- rpcs3/Emu/Cell/lv2/sys_net.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/rpcs3/Emu/Cell/lv2/sys_net.cpp b/rpcs3/Emu/Cell/lv2/sys_net.cpp index c8abaaed2f..629f24498f 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net.cpp @@ -1861,13 +1861,18 @@ error_code sys_net_bnet_poll(ppu_thread& ppu, vm::ptr fds, s32 n sys_net.warning("sys_net_bnet_poll(fds=*0x%x, nfds=%d, ms=%d)", fds, nfds, ms); + if (nfds <= 0) + { + return not_an_error(0); + } + atomic_t signaled{0}; u64 timeout = ms < 0 ? 0 : ms * 1000ull; std::vector fds_buf; - if (nfds > 0) + if (auto res = [&]() -> std::pair { fds_buf.assign(fds.get_ptr(), fds.get_ptr() + nfds); @@ -1937,7 +1942,7 @@ error_code sys_net_bnet_poll(ppu_thread& ppu, vm::ptr fds, s32 n if (ms == 0 || signaled) { - return not_an_error(signaled); + return {true, +signaled}; } for (s32 i = 0; i < nfds; i++) @@ -1988,10 +1993,11 @@ error_code sys_net_bnet_poll(ppu_thread& ppu, vm::ptr fds, s32 n } lv2_obj::sleep(ppu, timeout); - } - else + return {false, 0}; + }(); res.first) { - return not_an_error(0); + std::memcpy(fds.get_ptr(), fds_buf.data(), nfds * sizeof(fds[0])); + return not_an_error(res.second); } while (!ppu.state.test_and_reset(cpu_flag::signal))