sys_net: Add mutex to protect ppu_to_awake

This commit is contained in:
RipleyTom 2024-11-18 14:14:23 +01:00
commit b743186947
No known key found for this signature in database
GPG key ID: FC2B5DEF76BF4CC8
4 changed files with 18 additions and 4 deletions

View file

@ -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; \

View file

@ -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>().queue_ppu_wake(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>().queue_ppu_wake(ppu);
break; break;
default: default:
break; break;

View file

@ -85,8 +85,17 @@ namespace np
void init_np_handler_dependencies(); void init_np_handler_dependencies();
} }
void base_network_thread::queue_ppu_wake(ppu_thread* ppu)
{
std::lock_guard lock(mutex_ppu_to_awake);
ppu_to_awake.emplace_back(ppu);
}
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 +126,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);
{
std::lock_guard lock(mutex_ppu_to_awake);
ppu_to_awake.clear(); ppu_to_awake.clear();
}
std::vector<::pollfd> fds(lv2_socket::id_count); std::vector<::pollfd> fds(lv2_socket::id_count);
#ifdef _WIN32 #ifdef _WIN32

View file

@ -9,8 +9,10 @@
struct base_network_thread struct base_network_thread
{ {
shared_mutex mutex_ppu_to_awake;
std::vector<ppu_thread*> ppu_to_awake; std::vector<ppu_thread*> ppu_to_awake;
void queue_ppu_wake(ppu_thread* ppu);
void wake_threads(); void wake_threads();
}; };