From cea7737aefa2afc6083a14f404c807dc2add894f Mon Sep 17 00:00:00 2001 From: Rachel Bryk Date: Mon, 2 Sep 2013 21:54:28 -0400 Subject: [PATCH 1/3] Fix crash on stop in netplay, and stop netplay when anyone with a pad mapped in game stops emulation. --- Source/Core/Core/Src/NetPlayClient.cpp | 17 +++++++++++++++++ Source/Core/Core/Src/NetPlayClient.h | 1 + Source/Core/Core/Src/NetPlayServer.cpp | 14 ++++++++++++++ Source/Core/DolphinWX/Src/NetWindow.cpp | 6 ++---- 4 files changed, 34 insertions(+), 4 deletions(-) diff --git a/Source/Core/Core/Src/NetPlayClient.cpp b/Source/Core/Core/Src/NetPlayClient.cpp index 46acca6b94..3153ad2e2a 100644 --- a/Source/Core/Core/Src/NetPlayClient.cpp +++ b/Source/Core/Core/Src/NetPlayClient.cpp @@ -564,6 +564,23 @@ bool NetPlayClient::StopGame() return true; } +void NetPlayClient::Stop() +{ + bool isPadMapped = false; + for (unsigned int i = 0; i < 4; ++i) + { + if (m_pad_map[i] == m_local_player->pid) + isPadMapped = true; + } + // tell the server to stop if we have a pad mapped in game. + if (isPadMapped) + { + sf::Packet spac; + spac << (MessageId)NP_MSG_STOP_GAME; + m_socket.Send(spac); + } +} + // called from ---CPU--- thread u8 NetPlayClient::GetPadNum(u8 numPAD) { diff --git a/Source/Core/Core/Src/NetPlayClient.h b/Source/Core/Core/Src/NetPlayClient.h index 59d5742b18..a5aea6e472 100644 --- a/Source/Core/Core/Src/NetPlayClient.h +++ b/Source/Core/Core/Src/NetPlayClient.h @@ -74,6 +74,7 @@ public: bool StartGame(const std::string &path); bool StopGame(); + void Stop(); bool ChangeGame(const std::string& game); void SendChatMessage(const std::string& msg); diff --git a/Source/Core/Core/Src/NetPlayServer.cpp b/Source/Core/Core/Src/NetPlayServer.cpp index d8f2a7dd09..bcbfce9e29 100644 --- a/Source/Core/Core/Src/NetPlayServer.cpp +++ b/Source/Core/Core/Src/NetPlayServer.cpp @@ -376,6 +376,20 @@ unsigned int NetPlayServer::OnData(sf::Packet& packet, sf::SocketTCP& socket) } break; + case NP_MSG_STOP_GAME: + { + // tell clients to stop game + sf::Packet spac; + spac << (MessageId)NP_MSG_STOP_GAME; + + std::lock_guard lkp(m_crit.players); + std::lock_guard lks(m_crit.send); + SendToClients(spac); + + m_is_running = false; + } + break; + default : PanicAlertT("Unknown message with id:%d received from player:%d Kicking player!", mid, player.pid); // unknown message, kick the client diff --git a/Source/Core/DolphinWX/Src/NetWindow.cpp b/Source/Core/DolphinWX/Src/NetWindow.cpp index f962b58590..a31f9c1cb1 100644 --- a/Source/Core/DolphinWX/Src/NetWindow.cpp +++ b/Source/Core/DolphinWX/Src/NetWindow.cpp @@ -650,8 +650,6 @@ void PadMapDiag::OnAdjust(wxCommandEvent& event) void NetPlay::StopGame() { - if (netplay_server != NULL) - netplay_server->StopGame(); - - // TODO: allow non-hosting clients to close the window + if (netplay_client != NULL) + netplay_client->Stop(); } From 410197a3bd0b051b564c1abae788cd75e7985067 Mon Sep 17 00:00:00 2001 From: Rachel Bryk Date: Mon, 2 Sep 2013 22:05:05 -0400 Subject: [PATCH 2/3] Remove code that was made unused by revision cea7737aefa2. --- Source/Core/Core/Src/NetPlayServer.cpp | 17 ----------------- Source/Core/Core/Src/NetPlayServer.h | 1 - 2 files changed, 18 deletions(-) diff --git a/Source/Core/Core/Src/NetPlayServer.cpp b/Source/Core/Core/Src/NetPlayServer.cpp index bcbfce9e29..c4d2f583ea 100644 --- a/Source/Core/Core/Src/NetPlayServer.cpp +++ b/Source/Core/Core/Src/NetPlayServer.cpp @@ -465,23 +465,6 @@ bool NetPlayServer::StartGame(const std::string &path) return true; } - -// called from ---GUI--- thread -bool NetPlayServer::StopGame() -{ - // tell clients to stop game - sf::Packet spac; - spac << (MessageId)NP_MSG_STOP_GAME; - - std::lock_guard lkp(m_crit.players); - std::lock_guard lks(m_crit.send); - SendToClients(spac); - - m_is_running = false; - - return true; -} - // called from multiple threads void NetPlayServer::SendToClients(sf::Packet& packet, const PlayerId skip_pid) { diff --git a/Source/Core/Core/Src/NetPlayServer.h b/Source/Core/Core/Src/NetPlayServer.h index 5fbdb42802..5349764790 100644 --- a/Source/Core/Core/Src/NetPlayServer.h +++ b/Source/Core/Core/Src/NetPlayServer.h @@ -33,7 +33,6 @@ public: void SetNetSettings(const NetSettings &settings); bool StartGame(const std::string &path); - bool StopGame(); void GetPadMapping(PadMapping map[]); void SetPadMapping(const PadMapping map[]); From 7d09e72ac8ef892c44186007db77e37a4f4168c8 Mon Sep 17 00:00:00 2001 From: Rachel Bryk Date: Mon, 2 Sep 2013 23:33:53 -0400 Subject: [PATCH 3/3] Don't tell the server to stop if we already stopped. --- Source/Core/Core/Src/NetPlayClient.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Source/Core/Core/Src/NetPlayClient.cpp b/Source/Core/Core/Src/NetPlayClient.cpp index 3153ad2e2a..428a217fed 100644 --- a/Source/Core/Core/Src/NetPlayClient.cpp +++ b/Source/Core/Core/Src/NetPlayClient.cpp @@ -566,6 +566,8 @@ bool NetPlayClient::StopGame() void NetPlayClient::Stop() { + if (m_is_running == false) + return; bool isPadMapped = false; for (unsigned int i = 0; i < 4; ++i) {