mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-12 09:48:37 +12:00
re-add scope to sys_net_bnet_poll
This commit is contained in:
parent
72b2876b6a
commit
855b23b3fe
1 changed files with 84 additions and 82 deletions
|
@ -1057,115 +1057,117 @@ error_code sys_net_bnet_poll(ppu_thread& ppu, vm::ptr<sys_net_pollfd> fds, s32 n
|
||||||
|
|
||||||
std::vector<sys_net_pollfd> fds_buf;
|
std::vector<sys_net_pollfd> fds_buf;
|
||||||
|
|
||||||
fds_buf.assign(fds.get_ptr(), fds.get_ptr() + nfds);
|
|
||||||
|
|
||||||
std::unique_lock nw_lock(g_fxo->get<network_context>().s_nw_mutex);
|
|
||||||
std::shared_lock lock(id_manager::g_mutex);
|
|
||||||
|
|
||||||
::pollfd _fds[1024]{};
|
|
||||||
#ifdef _WIN32
|
|
||||||
bool connecting[1024]{};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (s32 i = 0; i < nfds; i++)
|
|
||||||
{
|
{
|
||||||
_fds[i].fd = -1;
|
fds_buf.assign(fds.get_ptr(), fds.get_ptr() + nfds);
|
||||||
fds_buf[i].revents = 0;
|
|
||||||
|
|
||||||
if (fds_buf[i].fd < 0)
|
std::unique_lock nw_lock(g_fxo->get<network_context>().s_nw_mutex);
|
||||||
{
|
std::shared_lock lock(id_manager::g_mutex);
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (auto sock = idm::check_unlocked<lv2_socket>(fds_buf[i].fd))
|
::pollfd _fds[1024]{};
|
||||||
{
|
|
||||||
signaled += sock->poll(fds[i], _fds[i]);
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
connecting[i] = sock->is_connecting();
|
bool connecting[1024]{};
|
||||||
#endif
|
#endif
|
||||||
}
|
|
||||||
else
|
for (s32 i = 0; i < nfds; i++)
|
||||||
{
|
{
|
||||||
fds_buf[i].revents |= SYS_NET_POLLNVAL;
|
_fds[i].fd = -1;
|
||||||
signaled++;
|
fds_buf[i].revents = 0;
|
||||||
|
|
||||||
|
if (fds_buf[i].fd < 0)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (auto sock = idm::check_unlocked<lv2_socket>(fds_buf[i].fd))
|
||||||
|
{
|
||||||
|
signaled += sock->poll(fds[i], _fds[i]);
|
||||||
|
#ifdef _WIN32
|
||||||
|
connecting[i] = sock->is_connecting();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fds_buf[i].revents |= SYS_NET_POLLNVAL;
|
||||||
|
signaled++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
windows_poll(_fds, nfds, 0, connecting);
|
windows_poll(_fds, nfds, 0, connecting);
|
||||||
#else
|
#else
|
||||||
::poll(_fds, nfds, 0);
|
::poll(_fds, nfds, 0);
|
||||||
#endif
|
#endif
|
||||||
for (s32 i = 0; i < nfds; i++)
|
for (s32 i = 0; i < nfds; i++)
|
||||||
{
|
|
||||||
if (_fds[i].revents & (POLLIN | POLLHUP))
|
|
||||||
fds_buf[i].revents |= SYS_NET_POLLIN;
|
|
||||||
if (_fds[i].revents & POLLOUT)
|
|
||||||
fds_buf[i].revents |= SYS_NET_POLLOUT;
|
|
||||||
if (_fds[i].revents & POLLERR)
|
|
||||||
fds_buf[i].revents |= SYS_NET_POLLERR;
|
|
||||||
|
|
||||||
if (fds_buf[i].revents)
|
|
||||||
{
|
{
|
||||||
signaled++;
|
if (_fds[i].revents & (POLLIN | POLLHUP))
|
||||||
}
|
fds_buf[i].revents |= SYS_NET_POLLIN;
|
||||||
}
|
if (_fds[i].revents & POLLOUT)
|
||||||
|
fds_buf[i].revents |= SYS_NET_POLLOUT;
|
||||||
|
if (_fds[i].revents & POLLERR)
|
||||||
|
fds_buf[i].revents |= SYS_NET_POLLERR;
|
||||||
|
|
||||||
if (ms == 0 || signaled)
|
if (fds_buf[i].revents)
|
||||||
{
|
{
|
||||||
lock.unlock();
|
signaled++;
|
||||||
nw_lock.unlock();
|
}
|
||||||
std::memcpy(fds.get_ptr(), fds_buf.data(), nfds * sizeof(fds[0]));
|
|
||||||
return not_an_error(signaled);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (s32 i = 0; i < nfds; i++)
|
|
||||||
{
|
|
||||||
if (fds_buf[i].fd < 0)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (auto sock = idm::check_unlocked<lv2_socket>(fds_buf[i].fd))
|
if (ms == 0 || signaled)
|
||||||
{
|
{
|
||||||
auto lock = sock->lock();
|
lock.unlock();
|
||||||
|
nw_lock.unlock();
|
||||||
|
std::memcpy(fds.get_ptr(), fds_buf.data(), nfds * sizeof(fds[0]));
|
||||||
|
return not_an_error(signaled);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (s32 i = 0; i < nfds; i++)
|
||||||
|
{
|
||||||
|
if (fds_buf[i].fd < 0)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (auto sock = idm::check_unlocked<lv2_socket>(fds_buf[i].fd))
|
||||||
|
{
|
||||||
|
auto lock = sock->lock();
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
sock->set_connecting(connecting[i]);
|
sock->set_connecting(connecting[i]);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bs_t<lv2_socket::poll_t> selected = +lv2_socket::poll_t::error;
|
bs_t<lv2_socket::poll_t> selected = +lv2_socket::poll_t::error;
|
||||||
|
|
||||||
if (fds_buf[i].events & SYS_NET_POLLIN)
|
if (fds_buf[i].events & SYS_NET_POLLIN)
|
||||||
selected += lv2_socket::poll_t::read;
|
selected += lv2_socket::poll_t::read;
|
||||||
if (fds_buf[i].events & SYS_NET_POLLOUT)
|
if (fds_buf[i].events & SYS_NET_POLLOUT)
|
||||||
selected += lv2_socket::poll_t::write;
|
selected += lv2_socket::poll_t::write;
|
||||||
// if (fds_buf[i].events & SYS_NET_POLLPRI) // Unimplemented
|
// if (fds_buf[i].events & SYS_NET_POLLPRI) // Unimplemented
|
||||||
// selected += lv2_socket::poll::error;
|
// selected += lv2_socket::poll::error;
|
||||||
|
|
||||||
sock->poll_queue(ppu.id, selected, [sock, selected, &fds_buf, i, &signaled, &ppu](bs_t<lv2_socket::poll_t> events)
|
sock->poll_queue(ppu.id, selected, [sock, selected, &fds_buf, i, &signaled, &ppu](bs_t<lv2_socket::poll_t> events)
|
||||||
{
|
|
||||||
if (events & selected)
|
|
||||||
{
|
{
|
||||||
if (events & selected & lv2_socket::poll_t::read)
|
if (events & selected)
|
||||||
fds_buf[i].revents |= SYS_NET_POLLIN;
|
{
|
||||||
if (events & selected & lv2_socket::poll_t::write)
|
if (events & selected & lv2_socket::poll_t::read)
|
||||||
fds_buf[i].revents |= SYS_NET_POLLOUT;
|
fds_buf[i].revents |= SYS_NET_POLLIN;
|
||||||
if (events & selected & lv2_socket::poll_t::error)
|
if (events & selected & lv2_socket::poll_t::write)
|
||||||
fds_buf[i].revents |= SYS_NET_POLLERR;
|
fds_buf[i].revents |= SYS_NET_POLLOUT;
|
||||||
|
if (events & selected & lv2_socket::poll_t::error)
|
||||||
|
fds_buf[i].revents |= SYS_NET_POLLERR;
|
||||||
|
|
||||||
signaled++;
|
signaled++;
|
||||||
g_fxo->get<network_context>().s_to_awake.emplace_back(&ppu);
|
g_fxo->get<network_context>().s_to_awake.emplace_back(&ppu);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
sock->set_poll_event(selected);
|
sock->set_poll_event(selected);
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
lv2_obj::sleep(ppu, timeout);
|
lv2_obj::sleep(ppu, timeout);
|
||||||
|
}
|
||||||
|
|
||||||
while (auto state = ppu.state.fetch_sub(cpu_flag::signal))
|
while (auto state = ppu.state.fetch_sub(cpu_flag::signal))
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue