sys_net: Fix sys_net_bnet_select page faults

This commit is contained in:
Eladash 2020-04-12 10:51:59 +03:00 committed by Ani
parent 179a9b3bf0
commit 00957ca4bf

View File

@ -1947,13 +1947,20 @@ error_code sys_net_bnet_select(ppu_thread& ppu, s32 nfds, vm::ptr<sys_net_fd_set
sys_net.error("sys_net_bnet_select(): exceptfds not implemented"); sys_net.error("sys_net_bnet_select(): exceptfds not implemented");
} }
sys_net_fd_set rread{}; sys_net_fd_set rread{}, _readfds{};
sys_net_fd_set rwrite{}; sys_net_fd_set rwrite{}, _writefds{};
sys_net_fd_set rexcept{}; sys_net_fd_set rexcept{}, _exceptfds{};
u64 timeout = !_timeout ? 0 : _timeout->tv_sec * 1000000ull + _timeout->tv_usec; u64 timeout = !_timeout ? 0 : _timeout->tv_sec * 1000000ull + _timeout->tv_usec;
if (nfds > 0 && nfds <= 1024) if (nfds > 0 && nfds <= 1024)
{ {
if (readfds)
_readfds = *readfds;
if (writefds)
_writefds = *writefds;
if (exceptfds)
_exceptfds = *exceptfds;
std::lock_guard nw_lock(g_fxo->get<network_context>()->s_nw_mutex); std::lock_guard nw_lock(g_fxo->get<network_context>()->s_nw_mutex);
reader_lock lock(id_manager::g_mutex); reader_lock lock(id_manager::g_mutex);
@ -1968,11 +1975,11 @@ error_code sys_net_bnet_select(ppu_thread& ppu, s32 nfds, vm::ptr<sys_net_fd_set
_fds[i].fd = -1; _fds[i].fd = -1;
bs_t<lv2_socket::poll> selected{}; bs_t<lv2_socket::poll> selected{};
if (readfds && readfds->bit(i)) if (readfds && _readfds.bit(i))
selected += lv2_socket::poll::read; selected += lv2_socket::poll::read;
if (writefds && writefds->bit(i)) if (writefds && _writefds.bit(i))
selected += lv2_socket::poll::write; selected += lv2_socket::poll::write;
//if (exceptfds && exceptfds->bit(i)) //if (exceptfds && _exceptfds.bit(i))
// selected += lv2_socket::poll::error; // selected += lv2_socket::poll::error;
if (selected) if (selected)
@ -2035,11 +2042,11 @@ error_code sys_net_bnet_select(ppu_thread& ppu, s32 nfds, vm::ptr<sys_net_fd_set
{ {
bs_t<lv2_socket::poll> selected{}; bs_t<lv2_socket::poll> selected{};
if (readfds && readfds->bit(i)) if (readfds && _readfds.bit(i))
selected += lv2_socket::poll::read; selected += lv2_socket::poll::read;
if (writefds && writefds->bit(i)) if (writefds && _writefds.bit(i))
selected += lv2_socket::poll::write; selected += lv2_socket::poll::write;
//if (exceptfds && exceptfds->bit(i)) //if (exceptfds && _exceptfds.bit(i))
// selected += lv2_socket::poll::error; // selected += lv2_socket::poll::error;
if (selected) if (selected)