Fix sys_net_bnet_poll regression (#8337)

Co-authored-by: Eladash <elad3356p@gmail.com>
This commit is contained in:
Ani 2020-06-04 17:30:11 +01:00 committed by GitHub
parent 650152e05f
commit 9657b3f1d4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1861,13 +1861,18 @@ error_code sys_net_bnet_poll(ppu_thread& ppu, vm::ptr<sys_net_pollfd> fds, s32 n
sys_net.warning("sys_net_bnet_poll(fds=*0x%x, nfds=%d, ms=%d)", fds, nfds, ms); 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<s32> signaled{0}; atomic_t<s32> signaled{0};
u64 timeout = ms < 0 ? 0 : ms * 1000ull; u64 timeout = ms < 0 ? 0 : ms * 1000ull;
std::vector<sys_net_pollfd> fds_buf; std::vector<sys_net_pollfd> fds_buf;
if (nfds > 0) if (auto res = [&]() -> std::pair<bool, u32>
{ {
fds_buf.assign(fds.get_ptr(), fds.get_ptr() + nfds); 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<sys_net_pollfd> fds, s32 n
if (ms == 0 || signaled) if (ms == 0 || signaled)
{ {
return not_an_error(signaled); return {true, +signaled};
} }
for (s32 i = 0; i < nfds; i++) for (s32 i = 0; i < nfds; i++)
@ -1988,10 +1993,11 @@ error_code sys_net_bnet_poll(ppu_thread& ppu, vm::ptr<sys_net_pollfd> fds, s32 n
} }
lv2_obj::sleep(ppu, timeout); lv2_obj::sleep(ppu, timeout);
} return {false, 0};
else }(); 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)) while (!ppu.state.test_and_reset(cpu_flag::signal))