diff --git a/Source/Core/Core/NetPlayClient.cpp b/Source/Core/Core/NetPlayClient.cpp index 9aeaf3b8cf..cbc5b26981 100644 --- a/Source/Core/Core/NetPlayClient.cpp +++ b/Source/Core/Core/NetPlayClient.cpp @@ -479,11 +479,11 @@ void NetPlayClient::Disconnect() m_server = nullptr; } -void NetPlayClient::RunOnThread(std::function func) +void NetPlayClient::SendAsync(sf::Packet* packet) { { - std::lock_guard lkq(m_crit.run_queue_write); - m_run_queue.Push(func); + std::lock_guard lkq(m_crit.async_queue_write); + m_async_queue.Push(std::unique_ptr(packet)); } ENetUtil::WakeupThread(m_client); } @@ -498,10 +498,10 @@ void NetPlayClient::ThreadFunc() if (m_traversal_client) m_traversal_client->HandleResends(); net = enet_host_service(m_client, &netEvent, 4); - while (!m_run_queue.Empty()) + while (!m_async_queue.Empty()) { - m_run_queue.Front()(); - m_run_queue.Pop(); + Send(*(m_async_queue.Front().get())); + m_async_queue.Pop(); } if (net > 0) { @@ -586,57 +586,47 @@ void NetPlayClient::GetPlayers(std::vector &player_list) // called from ---GUI--- thread void NetPlayClient::SendChatMessage(const std::string& msg) { - RunOnThread([msg, this]() { - sf::Packet spac; - spac << (MessageId)NP_MSG_CHAT_MESSAGE; - spac << msg; - Send(spac); - }); + sf::Packet* spac = new sf::Packet; + *spac << (MessageId)NP_MSG_CHAT_MESSAGE; + *spac << msg; + SendAsync(spac); } // called from ---CPU--- thread void NetPlayClient::SendPadState(const PadMapping in_game_pad, const GCPadStatus& pad) { - sf::Packet spac; - spac << (MessageId)NP_MSG_PAD_DATA; - spac << in_game_pad; - spac << pad.button << pad.analogA << pad.analogB << pad.stickX << pad.stickY << pad.substickX << pad.substickY << pad.triggerLeft << pad.triggerRight; + sf::Packet* spac = new sf::Packet; + *spac << (MessageId)NP_MSG_PAD_DATA; + *spac << in_game_pad; + *spac << pad.button << pad.analogA << pad.analogB << pad.stickX << pad.stickY << pad.substickX << pad.substickY << pad.triggerLeft << pad.triggerRight; - RunOnThread([spac, this]() mutable { - // send to server - Send(spac); - }); + SendAsync(spac); } // called from ---CPU--- thread void NetPlayClient::SendWiimoteState(const PadMapping in_game_pad, const NetWiimote& nw) { - RunOnThread([=]() { - // send to server - sf::Packet spac; - spac << (MessageId)NP_MSG_WIIMOTE_DATA; - spac << in_game_pad; - spac << (u8)nw.size(); - for (auto it : nw) - { - spac << it; - } - Send(spac); - }); + sf::Packet* spac = new sf::Packet; + *spac << (MessageId)NP_MSG_WIIMOTE_DATA; + *spac << in_game_pad; + *spac << (u8)nw.size(); + for (auto it : nw) + { + *spac << it; + } + SendAsync(spac); } // called from ---GUI--- thread bool NetPlayClient::StartGame(const std::string &path) { - RunOnThread([this](){ - std::lock_guard lkg(m_crit.game); - // tell server i started the game - sf::Packet spac; - spac << (MessageId)NP_MSG_START_GAME; - spac << m_current_game; - spac << (char *)&g_NetPlaySettings; - Send(spac); - }); + std::lock_guard lkg(m_crit.game); + // tell server i started the game + sf::Packet* spac = new sf::Packet; + *spac << (MessageId)NP_MSG_START_GAME; + *spac << m_current_game; + *spac << (char *)&g_NetPlaySettings; + SendAsync(spac); if (m_is_running) { @@ -986,11 +976,9 @@ void NetPlayClient::Stop() // tell the server to stop if we have a pad mapped in game. if (isPadMapped) { - RunOnThread([this](){ - sf::Packet spac; - spac << (MessageId)NP_MSG_STOP_GAME; - Send(spac); - }); + sf::Packet* spac = new sf::Packet; + *spac << (MessageId)NP_MSG_STOP_GAME; + SendAsync(spac); } } diff --git a/Source/Core/Core/NetPlayClient.h b/Source/Core/Core/NetPlayClient.h index 441cc17fb3..e47dcb7e94 100644 --- a/Source/Core/Core/NetPlayClient.h +++ b/Source/Core/Core/NetPlayClient.h @@ -48,7 +48,7 @@ class NetPlayClient : public TraversalClientClient { public: void ThreadFunc(); - void RunOnThread(std::function func); + void SendAsync(sf::Packet* packet); NetPlayClient(const std::string& address, const u16 port, NetPlayUI* dialog, const std::string& name, bool traversal, std::string centralServer, u16 centralPort); ~NetPlayClient(); @@ -95,10 +95,10 @@ protected: std::recursive_mutex game; // lock order std::recursive_mutex players; - std::recursive_mutex run_queue_write; + std::recursive_mutex async_queue_write; } m_crit; - Common::FifoQueue, false> m_run_queue; + Common::FifoQueue, false> m_async_queue; Common::FifoQueue m_pad_buffer[4]; Common::FifoQueue m_wiimote_buffer[4]; diff --git a/Source/Core/Core/NetPlayServer.cpp b/Source/Core/Core/NetPlayServer.cpp index 2c01b270f2..499a6088cb 100644 --- a/Source/Core/Core/NetPlayServer.cpp +++ b/Source/Core/Core/NetPlayServer.cpp @@ -126,10 +126,13 @@ void NetPlayServer::ThreadFunc() if (m_traversal_client) m_traversal_client->HandleResends(); net = enet_host_service(m_server, &netEvent, 1000); - while (!m_run_queue.Empty()) + while (!m_async_queue.Empty()) { - m_run_queue.Front()(); - m_run_queue.Pop(); + { + std::lock_guard lkp(m_crit.players); + SendToClients(*(m_async_queue.Front().get())); + } + m_async_queue.Pop(); } if (net > 0) { @@ -438,21 +441,18 @@ void NetPlayServer::AdjustPadBufferSize(unsigned int size) m_target_buffer_size = size; // tell clients to change buffer size - sf::Packet spac; - spac << (MessageId)NP_MSG_PAD_BUFFER; - spac << (u32)m_target_buffer_size; + sf::Packet* spac = new sf::Packet; + *spac << (MessageId)NP_MSG_PAD_BUFFER; + *spac << (u32)m_target_buffer_size; - RunOnThread([spac, this]() mutable { - std::lock_guard lkp(m_crit.players); - SendToClients(spac); - }); + SendAsyncToClients(spac); } -void NetPlayServer::RunOnThread(std::function func) +void NetPlayServer::SendAsyncToClients(sf::Packet* packet) { { - std::lock_guard lkq(m_crit.run_queue_write); - m_run_queue.Push(func); + std::lock_guard lkq(m_crit.async_queue_write); + m_async_queue.Push(std::unique_ptr(packet)); } ENetUtil::WakeupThread(m_server); } @@ -598,15 +598,12 @@ void NetPlayServer::OnTraversalStateChanged() // called from ---GUI--- thread void NetPlayServer::SendChatMessage(const std::string& msg) { - sf::Packet spac; - spac << (MessageId)NP_MSG_CHAT_MESSAGE; - spac << (PlayerId)0; // server id always 0 - spac << msg; + sf::Packet* spac = new sf::Packet; + *spac << (MessageId)NP_MSG_CHAT_MESSAGE; + *spac << (PlayerId)0; // server id always 0 + *spac << msg; - RunOnThread([spac, this]() mutable { - std::lock_guard lkp(m_crit.players); - SendToClients(spac); - }); + SendAsyncToClients(spac); } // called from ---GUI--- thread @@ -617,14 +614,11 @@ bool NetPlayServer::ChangeGame(const std::string &game) m_selected_game = game; // send changed game to clients - sf::Packet spac; - spac << (MessageId)NP_MSG_CHANGE_GAME; - spac << game; + sf::Packet* spac = new sf::Packet; + *spac << (MessageId)NP_MSG_CHANGE_GAME; + *spac << game; - RunOnThread([spac, this]() mutable { - std::lock_guard lkp(m_crit.players); - SendToClients(spac); - }); + SendAsyncToClients(spac); return true; } @@ -647,25 +641,22 @@ bool NetPlayServer::StartGame() g_netplay_initial_gctime = Common::Timer::GetLocalTimeSinceJan1970(); // tell clients to start game - sf::Packet spac; - spac << (MessageId)NP_MSG_START_GAME; - spac << m_current_game; - spac << m_settings.m_CPUthread; - spac << m_settings.m_CPUcore; - spac << m_settings.m_DSPEnableJIT; - spac << m_settings.m_DSPHLE; - spac << m_settings.m_WriteToMemcard; - spac << m_settings.m_OCEnable; - spac << m_settings.m_OCFactor; - spac << m_settings.m_EXIDevice[0]; - spac << m_settings.m_EXIDevice[1]; - spac << (u32)g_netplay_initial_gctime; - spac << (u32)g_netplay_initial_gctime << 32; + sf::Packet* spac = new sf::Packet; + *spac << (MessageId)NP_MSG_START_GAME; + *spac << m_current_game; + *spac << m_settings.m_CPUthread; + *spac << m_settings.m_CPUcore; + *spac << m_settings.m_DSPEnableJIT; + *spac << m_settings.m_DSPHLE; + *spac << m_settings.m_WriteToMemcard; + *spac << m_settings.m_OCEnable; + *spac << m_settings.m_OCFactor; + *spac << m_settings.m_EXIDevice[0]; + *spac << m_settings.m_EXIDevice[1]; + *spac << (u32)g_netplay_initial_gctime; + *spac << (u32)g_netplay_initial_gctime << 32; - RunOnThread([spac, this]() mutable { - std::lock_guard lkp(m_crit.players); - SendToClients(spac); - }); + SendAsyncToClients(spac); m_is_running = true; diff --git a/Source/Core/Core/NetPlayServer.h b/Source/Core/Core/NetPlayServer.h index 6c53b537ad..e1a22c8de9 100644 --- a/Source/Core/Core/NetPlayServer.h +++ b/Source/Core/Core/NetPlayServer.h @@ -21,7 +21,7 @@ class NetPlayServer : public TraversalClientClient { public: void ThreadFunc(); - void RunOnThread(std::function func); + void SendAsyncToClients(sf::Packet* packet); NetPlayServer(const u16 port, bool traversal, std::string centralServer, u16 centralPort); ~NetPlayServer(); @@ -104,12 +104,12 @@ private: std::recursive_mutex game; // lock order std::recursive_mutex players; - std::recursive_mutex run_queue_write; + std::recursive_mutex async_queue_write; } m_crit; std::string m_selected_game; std::thread m_thread; - Common::FifoQueue, false> m_run_queue; + Common::FifoQueue, false> m_async_queue; ENetHost* m_server; TraversalClient* m_traversal_client;