From 7730eacea801557c9d88e19e5893ae801488dae2 Mon Sep 17 00:00:00 2001 From: ITotalJustice <47043333+ITotalJustice@users.noreply.github.com> Date: Tue, 17 Jun 2025 11:23:45 +0100 Subject: [PATCH] fix mtp install (again) due to the next transfer trying to start before the previous one had finished. --- .../ui/menus/install_stream_menu_base.hpp | 4 +- .../ui/menus/install_stream_menu_base.cpp | 41 +++++++++++++++++-- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/sphaira/include/ui/menus/install_stream_menu_base.hpp b/sphaira/include/ui/menus/install_stream_menu_base.hpp index aa41d9d..705c876 100644 --- a/sphaira/include/ui/menus/install_stream_menu_base.hpp +++ b/sphaira/include/ui/menus/install_stream_menu_base.hpp @@ -34,8 +34,10 @@ private: fs::FsPath m_path{}; std::stop_token m_token{}; std::vector m_buffer{}; - Mutex m_mutex{}; CondVar m_can_read{}; + +public: + Mutex m_mutex{}; bool m_active{}; }; diff --git a/sphaira/source/ui/menus/install_stream_menu_base.cpp b/sphaira/source/ui/menus/install_stream_menu_base.cpp index b1182e2..35bc737 100644 --- a/sphaira/source/ui/menus/install_stream_menu_base.cpp +++ b/sphaira/source/ui/menus/install_stream_menu_base.cpp @@ -191,9 +191,44 @@ void Menu::Draw(NVGcontext* vg, Theme* theme) { bool Menu::OnInstallStart(const char* path) { log_write("[Menu::OnInstallStart] inside\n"); - if (INSTALL_STATE == InstallState::Progress) { - log_write("[Menu::OnInstallStart] already in progress\n"); - return false; + + for (;;) { + { + SCOPED_MUTEX(&m_mutex); + + if (m_state != State::Progress) { + break; + } + + if (GetToken().stop_requested()) { + return false; + } + } + + svcSleepThread(1e+6); + } + + log_write("[Menu::OnInstallStart] got state: %u\n", (u8)m_state); + + if (m_source) { + log_write("[Menu::OnInstallStart] we have source\n"); + for (;;) { + { + SCOPED_MUTEX(&m_source->m_mutex); + + if (!m_source->m_active && INSTALL_STATE != InstallState::Progress) { + break; + } + + if (GetToken().stop_requested()) { + return false; + } + } + + svcSleepThread(1e+6); + } + + log_write("[Menu::OnInstallStart] stopped polling source\n"); } SCOPED_MUTEX(&m_mutex);