diff options
| author | Techjar <tecknojar@gmail.com> | 2018-07-12 20:37:12 -0400 |
|---|---|---|
| committer | Techjar <tecknojar@gmail.com> | 2018-07-21 00:04:14 -0400 |
| commit | cfeffdcf4208686d64d509f559272d64bbd5da70 (patch) | |
| tree | 661c18a10d3ca134441d4082ddde1231a74cf7ad /Source/Core/DolphinQt/NetPlay | |
| parent | a21d536f99ae75f6f8f23870043ed1c8ab19c34d (diff) | |
Fix more segfaults on NetPlay quit
Basically everything here was race conditions in Qt callbacks, so I changed the client/server instances to std::shared_ptr and added null checks. It checks that the object exists in the callback, and the shared_ptr ensures it doesn't get destroyed until we're done with it.
MD5 check would also cause a segfault if you quit without cancelling it first, which was pretty silly.
Diffstat (limited to 'Source/Core/DolphinQt/NetPlay')
| -rw-r--r-- | Source/Core/DolphinQt/NetPlay/MD5Dialog.cpp | 17 | ||||
| -rw-r--r-- | Source/Core/DolphinQt/NetPlay/NetPlayDialog.cpp | 23 | ||||
| -rw-r--r-- | Source/Core/DolphinQt/NetPlay/PadMappingDialog.cpp | 4 |
3 files changed, 29 insertions, 15 deletions
diff --git a/Source/Core/DolphinQt/NetPlay/MD5Dialog.cpp b/Source/Core/DolphinQt/NetPlay/MD5Dialog.cpp index b86b1e782e..ec8db64fc1 100644 --- a/Source/Core/DolphinQt/NetPlay/MD5Dialog.cpp +++ b/Source/Core/DolphinQt/NetPlay/MD5Dialog.cpp @@ -21,7 +21,11 @@ static QString GetPlayerNameFromPID(int pid) { QString player_name = QObject::tr("Invalid Player ID"); - for (const auto* player : Settings::Instance().GetNetPlayClient()->GetPlayers()) + auto client = Settings::Instance().GetNetPlayClient(); + if (!client) + return player_name; + + for (const auto* player : client->GetPlayers()) { if (player->pid == pid) { @@ -82,7 +86,11 @@ void MD5Dialog::show(const QString& title) m_results.clear(); m_check_label->setText(QString::fromStdString("")); - for (const auto* player : Settings::Instance().GetNetPlayClient()->GetPlayers()) + auto client = Settings::Instance().GetNetPlayClient(); + if (!client) + return; + + for (const auto* player : client->GetPlayers()) { m_progress_bars[player->pid] = new QProgressBar; m_status_labels[player->pid] = new QLabel; @@ -118,7 +126,8 @@ void MD5Dialog::SetResult(int pid, const std::string& result) m_results.push_back(result); - if (m_results.size() >= Settings::Instance().GetNetPlayClient()->GetPlayers().size()) + auto client = Settings::Instance().GetNetPlayClient(); + if (client && m_results.size() >= client->GetPlayers().size()) { if (std::adjacent_find(m_results.begin(), m_results.end(), std::not_equal_to<>()) == m_results.end()) @@ -134,7 +143,7 @@ void MD5Dialog::SetResult(int pid, const std::string& result) void MD5Dialog::reject() { - auto* server = Settings::Instance().GetNetPlayServer(); + auto server = Settings::Instance().GetNetPlayServer(); if (server) server->AbortMD5(); diff --git a/Source/Core/DolphinQt/NetPlay/NetPlayDialog.cpp b/Source/Core/DolphinQt/NetPlay/NetPlayDialog.cpp index ce296acef8..5e3d757eeb 100644 --- a/Source/Core/DolphinQt/NetPlay/NetPlayDialog.cpp +++ b/Source/Core/DolphinQt/NetPlay/NetPlayDialog.cpp @@ -240,8 +240,9 @@ void NetPlayDialog::ConnectWidgets() if (value == m_buffer_size) return; - if (Settings::Instance().GetNetPlayServer() != nullptr) - Settings::Instance().GetNetPlayServer()->AdjustPadBufferSize(value); + auto server = Settings::Instance().GetNetPlayServer(); + if (server) + server->AdjustPadBufferSize(value); }); connect(m_start_button, &QPushButton::clicked, this, &NetPlayDialog::OnStart); @@ -371,7 +372,10 @@ void NetPlayDialog::show(std::string nickname, bool use_traversal) void NetPlayDialog::UpdateGUI() { - auto* client = Settings::Instance().GetNetPlayClient(); + auto client = Settings::Instance().GetNetPlayClient(); + auto server = Settings::Instance().GetNetPlayServer(); + if (!client) + return; // Update Player List const auto players = client->GetPlayers(); @@ -466,11 +470,10 @@ void NetPlayDialog::UpdateGUI() break; } } - else if (Settings::Instance().GetNetPlayServer()) + else if (server) { - m_hostcode_label->setText( - QString::fromStdString(Settings::Instance().GetNetPlayServer()->GetInterfaceHost( - m_room_box->currentData().toString().toStdString()))); + m_hostcode_label->setText(QString::fromStdString( + server->GetInterfaceHost(m_room_box->currentData().toString().toStdString()))); m_hostcode_action_button->setText(tr("Copy")); m_hostcode_action_button->setEnabled(true); } @@ -555,7 +558,7 @@ void NetPlayDialog::GameStatusChanged(bool running) void NetPlayDialog::SetOptionsEnabled(bool enabled) { - if (Settings::Instance().GetNetPlayServer() != nullptr) + if (Settings::Instance().GetNetPlayServer()) { m_start_button->setEnabled(enabled); m_game_button->setEnabled(enabled); @@ -574,7 +577,9 @@ void NetPlayDialog::OnMsgStartGame() DisplayMessage(tr("Started game"), "green"); QueueOnObject(this, [this] { - Settings::Instance().GetNetPlayClient()->StartGame(FindGame(m_current_game)); + auto client = Settings::Instance().GetNetPlayClient(); + if (client) + client->StartGame(FindGame(m_current_game)); }); } diff --git a/Source/Core/DolphinQt/NetPlay/PadMappingDialog.cpp b/Source/Core/DolphinQt/NetPlay/PadMappingDialog.cpp index fbfe64e538..d1b7c97ee4 100644 --- a/Source/Core/DolphinQt/NetPlay/PadMappingDialog.cpp +++ b/Source/Core/DolphinQt/NetPlay/PadMappingDialog.cpp @@ -59,8 +59,8 @@ void PadMappingDialog::ConnectWidgets() int PadMappingDialog::exec() { - auto* client = Settings::Instance().GetNetPlayClient(); - auto* server = Settings::Instance().GetNetPlayServer(); + auto client = Settings::Instance().GetNetPlayClient(); + auto server = Settings::Instance().GetNetPlayServer(); // Load Settings m_players = client->GetPlayers(); m_pad_mapping = server->GetPadMapping(); |
