mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-06 06:51:26 +12:00
sys_net: Remove lingering ppu_to_awake from queue on timeout
This commit is contained in:
parent
a9f6b012b8
commit
0e8f1a9bf9
6 changed files with 50 additions and 4 deletions
|
@ -54,7 +54,7 @@ void fmt_class_string<sys_net_error>::format(std::string& out, u64 arg)
|
||||||
{
|
{
|
||||||
format_enum(out, arg, [](auto error)
|
format_enum(out, arg, [](auto error)
|
||||||
{
|
{
|
||||||
switch (s32 _error = error)
|
switch (static_cast<s32>(error))
|
||||||
{
|
{
|
||||||
#define SYS_NET_ERROR_CASE(x) \
|
#define SYS_NET_ERROR_CASE(x) \
|
||||||
case -x: return "-" #x; \
|
case -x: return "-" #x; \
|
||||||
|
@ -1413,6 +1413,7 @@ error_code sys_net_bnet_poll(ppu_thread& ppu, vm::ptr<sys_net_pollfd> fds, s32 n
|
||||||
}
|
}
|
||||||
|
|
||||||
has_timedout = network_clear_queue(ppu);
|
has_timedout = network_clear_queue(ppu);
|
||||||
|
clear_ppu_to_awake(ppu);
|
||||||
ppu.state -= cpu_flag::signal;
|
ppu.state -= cpu_flag::signal;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1646,6 +1647,7 @@ error_code sys_net_bnet_select(ppu_thread& ppu, s32 nfds, vm::ptr<sys_net_fd_set
|
||||||
}
|
}
|
||||||
|
|
||||||
has_timedout = network_clear_queue(ppu);
|
has_timedout = network_clear_queue(ppu);
|
||||||
|
clear_ppu_to_awake(ppu);
|
||||||
ppu.state -= cpu_flag::signal;
|
ppu.state -= cpu_flag::signal;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1731,6 +1733,10 @@ error_code lv2_socket::abort_socket(s32 flags)
|
||||||
if (!ppu)
|
if (!ppu)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
// Avoid possible double signaling
|
||||||
|
network_clear_queue(*ppu);
|
||||||
|
clear_ppu_to_awake(*ppu);
|
||||||
|
|
||||||
sys_net.warning("lv2_socket::abort_socket(): waking up \"%s\": (func: %s, r3=0x%x, r4=0x%x, r5=0x%x, r6=0x%x)", ppu->get_name(), ppu->current_function, ppu->gpr[3], ppu->gpr[4], ppu->gpr[5], ppu->gpr[6]);
|
sys_net.warning("lv2_socket::abort_socket(): waking up \"%s\": (func: %s, r3=0x%x, r4=0x%x, r5=0x%x, r6=0x%x)", ppu->get_name(), ppu->current_function, ppu->gpr[3], ppu->gpr[4], ppu->gpr[5], ppu->gpr[6]);
|
||||||
ppu->gpr[3] = static_cast<u64>(-SYS_NET_EINTR);
|
ppu->gpr[3] = static_cast<u64>(-SYS_NET_EINTR);
|
||||||
lv2_obj::append(ppu.get());
|
lv2_obj::append(ppu.get());
|
||||||
|
|
|
@ -165,11 +165,11 @@ void lv2_socket::queue_wake(ppu_thread* ppu)
|
||||||
{
|
{
|
||||||
case SYS_NET_SOCK_STREAM:
|
case SYS_NET_SOCK_STREAM:
|
||||||
case SYS_NET_SOCK_DGRAM:
|
case SYS_NET_SOCK_DGRAM:
|
||||||
g_fxo->get<network_context>().ppu_to_awake.emplace_back(ppu);
|
g_fxo->get<network_context>().add_ppu_to_awake(ppu);
|
||||||
break;
|
break;
|
||||||
case SYS_NET_SOCK_DGRAM_P2P:
|
case SYS_NET_SOCK_DGRAM_P2P:
|
||||||
case SYS_NET_SOCK_STREAM_P2P:
|
case SYS_NET_SOCK_STREAM_P2P:
|
||||||
g_fxo->get<p2p_context>().ppu_to_awake.emplace_back(ppu);
|
g_fxo->get<p2p_context>().add_ppu_to_awake(ppu);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -85,8 +85,32 @@ namespace np
|
||||||
void init_np_handler_dependencies();
|
void init_np_handler_dependencies();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void base_network_thread::add_ppu_to_awake(ppu_thread* ppu)
|
||||||
|
{
|
||||||
|
std::lock_guard lock(mutex_ppu_to_awake);
|
||||||
|
ppu_to_awake.emplace_back(ppu);
|
||||||
|
}
|
||||||
|
|
||||||
|
void base_network_thread::del_ppu_to_awake(ppu_thread* ppu)
|
||||||
|
{
|
||||||
|
std::lock_guard lock(mutex_ppu_to_awake);
|
||||||
|
|
||||||
|
for (auto it = ppu_to_awake.begin(); it != ppu_to_awake.end();)
|
||||||
|
{
|
||||||
|
if (*it == ppu)
|
||||||
|
{
|
||||||
|
it = ppu_to_awake.erase(it);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
it++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void base_network_thread::wake_threads()
|
void base_network_thread::wake_threads()
|
||||||
{
|
{
|
||||||
|
std::lock_guard lock(mutex_ppu_to_awake);
|
||||||
|
|
||||||
ppu_to_awake.erase(std::unique(ppu_to_awake.begin(), ppu_to_awake.end()), ppu_to_awake.end());
|
ppu_to_awake.erase(std::unique(ppu_to_awake.begin(), ppu_to_awake.end()), ppu_to_awake.end());
|
||||||
for (ppu_thread* ppu : ppu_to_awake)
|
for (ppu_thread* ppu : ppu_to_awake)
|
||||||
{
|
{
|
||||||
|
@ -117,7 +141,10 @@ void network_thread::operator()()
|
||||||
std::vector<std::shared_ptr<lv2_socket>> socklist;
|
std::vector<std::shared_ptr<lv2_socket>> socklist;
|
||||||
socklist.reserve(lv2_socket::id_count);
|
socklist.reserve(lv2_socket::id_count);
|
||||||
|
|
||||||
ppu_to_awake.clear();
|
{
|
||||||
|
std::lock_guard lock(mutex_ppu_to_awake);
|
||||||
|
ppu_to_awake.clear();
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<::pollfd> fds(lv2_socket::id_count);
|
std::vector<::pollfd> fds(lv2_socket::id_count);
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
|
|
@ -9,6 +9,10 @@
|
||||||
|
|
||||||
struct base_network_thread
|
struct base_network_thread
|
||||||
{
|
{
|
||||||
|
void add_ppu_to_awake(ppu_thread* ppu);
|
||||||
|
void del_ppu_to_awake(ppu_thread* ppu);
|
||||||
|
|
||||||
|
shared_mutex mutex_ppu_to_awake;
|
||||||
std::vector<ppu_thread*> ppu_to_awake;
|
std::vector<ppu_thread*> ppu_to_awake;
|
||||||
|
|
||||||
void wake_threads();
|
void wake_threads();
|
||||||
|
|
|
@ -6,6 +6,8 @@
|
||||||
#include "lv2_socket.h"
|
#include "lv2_socket.h"
|
||||||
#include "sys_net_helpers.h"
|
#include "sys_net_helpers.h"
|
||||||
|
|
||||||
|
#include "network_context.h"
|
||||||
|
|
||||||
LOG_CHANNEL(sys_net);
|
LOG_CHANNEL(sys_net);
|
||||||
|
|
||||||
int get_native_error()
|
int get_native_error()
|
||||||
|
@ -194,6 +196,12 @@ u32 network_clear_queue(ppu_thread& ppu)
|
||||||
return cleared;
|
return cleared;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void clear_ppu_to_awake(ppu_thread& ppu)
|
||||||
|
{
|
||||||
|
g_fxo->get<network_context>().del_ppu_to_awake(&ppu);
|
||||||
|
g_fxo->get<p2p_context>().del_ppu_to_awake(&ppu);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
// Workaround function for WSAPoll not reporting failed connections
|
// Workaround function for WSAPoll not reporting failed connections
|
||||||
void windows_poll(std::vector<pollfd>& fds, unsigned long nfds, int timeout, std::vector<bool>& connecting)
|
void windows_poll(std::vector<pollfd>& fds, unsigned long nfds, int timeout, std::vector<bool>& connecting)
|
||||||
|
|
|
@ -24,6 +24,7 @@ sys_net_sockaddr native_addr_to_sys_net_addr(const ::sockaddr_storage& native_ad
|
||||||
::sockaddr_in sys_net_addr_to_native_addr(const sys_net_sockaddr& sn_addr);
|
::sockaddr_in sys_net_addr_to_native_addr(const sys_net_sockaddr& sn_addr);
|
||||||
bool is_ip_public_address(const ::sockaddr_in& addr);
|
bool is_ip_public_address(const ::sockaddr_in& addr);
|
||||||
u32 network_clear_queue(ppu_thread& ppu);
|
u32 network_clear_queue(ppu_thread& ppu);
|
||||||
|
void clear_ppu_to_awake(ppu_thread& ppu);
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
void windows_poll(std::vector<pollfd>& fds, unsigned long nfds, int timeout, std::vector<bool>& connecting);
|
void windows_poll(std::vector<pollfd>& fds, unsigned long nfds, int timeout, std::vector<bool>& connecting);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue