mirror of
https://github.com/cemu-project/Cemu.git
synced 2024-11-25 18:46:55 +01:00
input: Fix crash when closing add controller dialog before search completes (#1386)
This commit is contained in:
parent
63e1289bb5
commit
459fd5d9bb
@ -114,6 +114,11 @@ InputAPIAddWindow::InputAPIAddWindow(wxWindow* parent, const wxPoint& position,
|
|||||||
this->Bind(wxControllersRefreshed, &InputAPIAddWindow::on_controllers_refreshed, this);
|
this->Bind(wxControllersRefreshed, &InputAPIAddWindow::on_controllers_refreshed, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
InputAPIAddWindow::~InputAPIAddWindow()
|
||||||
|
{
|
||||||
|
discard_thread_result();
|
||||||
|
}
|
||||||
|
|
||||||
void InputAPIAddWindow::on_add_button(wxCommandEvent& event)
|
void InputAPIAddWindow::on_add_button(wxCommandEvent& event)
|
||||||
{
|
{
|
||||||
const auto selection = m_input_api->GetSelection();
|
const auto selection = m_input_api->GetSelection();
|
||||||
@ -159,6 +164,8 @@ std::unique_ptr<ControllerProviderSettings> InputAPIAddWindow::get_settings() co
|
|||||||
|
|
||||||
void InputAPIAddWindow::on_api_selected(wxCommandEvent& event)
|
void InputAPIAddWindow::on_api_selected(wxCommandEvent& event)
|
||||||
{
|
{
|
||||||
|
discard_thread_result();
|
||||||
|
|
||||||
if (m_input_api->GetSelection() == wxNOT_FOUND)
|
if (m_input_api->GetSelection() == wxNOT_FOUND)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -239,19 +246,25 @@ void InputAPIAddWindow::on_controller_dropdown(wxCommandEvent& event)
|
|||||||
m_controller_list->Append(_("Searching for controllers..."), (wxClientData*)nullptr);
|
m_controller_list->Append(_("Searching for controllers..."), (wxClientData*)nullptr);
|
||||||
m_controller_list->SetSelection(wxNOT_FOUND);
|
m_controller_list->SetSelection(wxNOT_FOUND);
|
||||||
|
|
||||||
std::thread([this, provider, selected_uuid]()
|
m_search_thread_data = std::make_unique<AsyncThreadData>();
|
||||||
|
std::thread([this, provider, selected_uuid](std::shared_ptr<AsyncThreadData> data)
|
||||||
{
|
{
|
||||||
auto available_controllers = provider->get_controllers();
|
auto available_controllers = provider->get_controllers();
|
||||||
|
|
||||||
wxCommandEvent event(wxControllersRefreshed);
|
{
|
||||||
event.SetEventObject(m_controller_list);
|
std::lock_guard lock{data->mutex};
|
||||||
event.SetClientObject(new wxCustomData(std::move(available_controllers)));
|
if(!data->discardResult)
|
||||||
event.SetInt(provider->api());
|
{
|
||||||
event.SetString(selected_uuid);
|
wxCommandEvent event(wxControllersRefreshed);
|
||||||
wxPostEvent(this, event);
|
event.SetEventObject(m_controller_list);
|
||||||
|
event.SetClientObject(new wxCustomData(std::move(available_controllers)));
|
||||||
m_search_running = false;
|
event.SetInt(provider->api());
|
||||||
}).detach();
|
event.SetString(selected_uuid);
|
||||||
|
wxPostEvent(this, event);
|
||||||
|
m_search_running = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, m_search_thread_data).detach();
|
||||||
}
|
}
|
||||||
|
|
||||||
void InputAPIAddWindow::on_controller_selected(wxCommandEvent& event)
|
void InputAPIAddWindow::on_controller_selected(wxCommandEvent& event)
|
||||||
@ -301,3 +314,13 @@ void InputAPIAddWindow::on_controllers_refreshed(wxCommandEvent& event)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void InputAPIAddWindow::discard_thread_result()
|
||||||
|
{
|
||||||
|
m_search_running = false;
|
||||||
|
if(m_search_thread_data)
|
||||||
|
{
|
||||||
|
std::lock_guard lock{m_search_thread_data->mutex};
|
||||||
|
m_search_thread_data->discardResult = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -19,6 +19,7 @@ class InputAPIAddWindow : public wxDialog
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
InputAPIAddWindow(wxWindow* parent, const wxPoint& position, const std::vector<ControllerPtr>& controllers);
|
InputAPIAddWindow(wxWindow* parent, const wxPoint& position, const std::vector<ControllerPtr>& controllers);
|
||||||
|
~InputAPIAddWindow();
|
||||||
|
|
||||||
bool is_valid() const { return m_type.has_value() && m_controller != nullptr; }
|
bool is_valid() const { return m_type.has_value() && m_controller != nullptr; }
|
||||||
InputAPI::Type get_type() const { return m_type.value(); }
|
InputAPI::Type get_type() const { return m_type.value(); }
|
||||||
@ -38,6 +39,8 @@ private:
|
|||||||
void on_controller_selected(wxCommandEvent& event);
|
void on_controller_selected(wxCommandEvent& event);
|
||||||
void on_controllers_refreshed(wxCommandEvent& event);
|
void on_controllers_refreshed(wxCommandEvent& event);
|
||||||
|
|
||||||
|
void discard_thread_result();
|
||||||
|
|
||||||
wxChoice* m_input_api;
|
wxChoice* m_input_api;
|
||||||
wxComboBox* m_controller_list;
|
wxComboBox* m_controller_list;
|
||||||
wxButton* m_ok_button;
|
wxButton* m_ok_button;
|
||||||
@ -50,4 +53,10 @@ private:
|
|||||||
|
|
||||||
std::vector<ControllerPtr> m_controllers;
|
std::vector<ControllerPtr> m_controllers;
|
||||||
std::atomic_bool m_search_running = false;
|
std::atomic_bool m_search_running = false;
|
||||||
|
struct AsyncThreadData
|
||||||
|
{
|
||||||
|
std::atomic_bool discardResult = false;
|
||||||
|
std::mutex mutex;
|
||||||
|
};
|
||||||
|
std::shared_ptr<AsyncThreadData> m_search_thread_data;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user