From c52a7be00f208939e226b0b2fefb8c9920fc2418 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 23 Sep 2026 01:18:14 +0000 Subject: [PATCH] 2026-09-23 01:18:14 Signed-off-by: lizzie --- .../apps/audio_renderer/audio_renderer.cpp | 18 +++++++++++------- src/common/bounded_threadsafe_queue.h | 12 ++++++------ src/core/hle/kernel/k_worker_task_manager.cpp | 4 +++- src/core/hle/kernel/k_worker_task_manager.h | 2 +- src/qt_common/render/emu_thread.cpp | 7 +++++-- 5 files changed, 26 insertions(+), 17 deletions(-) diff --git a/src/audio_core/adsp/apps/audio_renderer/audio_renderer.cpp b/src/audio_core/adsp/apps/audio_renderer/audio_renderer.cpp index 45a69eca03..dca1b4592f 100644 --- a/src/audio_core/adsp/apps/audio_renderer/audio_renderer.cpp +++ b/src/audio_core/adsp/apps/audio_renderer/audio_renderer.cpp @@ -46,13 +46,15 @@ void AudioRenderer::Stop() { return; } - mailbox.Send(Direction::DSP, Message::Shutdown); - if (mailbox.Receive(Direction::Host) != Message::Shutdown) { - LOG_ERROR(Service_Audio, "Host Audio Renderer -- Failed to receive shutdown " - "message response from ADSP!"); + if (main_thread.joinable()) { + main_thread.request_stop(); + mailbox.Send(Direction::DSP, Message::Shutdown); + if (mailbox.Receive(Direction::Host, main_thread.get_stop_token()) != Message::Shutdown) { + LOG_ERROR(Service_Audio, "Host Audio Renderer -- Failed to receive shutdown " + "message response from ADSP!"); + } + main_thread.join(); } - main_thread.request_stop(); - main_thread.join(); for (auto& stream : streams) { if (stream) { @@ -147,7 +149,9 @@ void AudioRenderer::Main(std::stop_token stop_token) { constexpr u64 max_process_time{2'304'000ULL}; while (!stop_token.stop_requested()) { - auto msg{mailbox.Receive(Direction::DSP)}; + auto msg = mailbox.Receive(Direction::DSP, stop_token); + if (stop_token.stop_requested()) + break; switch (msg) { case Message::Shutdown: mailbox.Send(Direction::Host, Message::Shutdown); diff --git a/src/common/bounded_threadsafe_queue.h b/src/common/bounded_threadsafe_queue.h index e5c33d75d9..2edd5476c9 100644 --- a/src/common/bounded_threadsafe_queue.h +++ b/src/common/bounded_threadsafe_queue.h @@ -109,12 +109,6 @@ private: if (read_index == producer.index.load(std::memory_order::acquire)) { return false; } - } else if constexpr (Mode == PopMode::Wait) { - // Wait until the queue is not empty. - std::unique_lock lock{consumer.cv_mutex}; - consumer.cv.wait(lock, [this, read_index] { - return read_index != producer.index.load(std::memory_order::acquire); - }); } else if constexpr (Mode == PopMode::WaitWithStopToken) { // Wait until the queue is not empty. std::unique_lock lock{consumer.cv_mutex}; @@ -124,6 +118,12 @@ private: if (stop_token.stop_requested()) { return false; } + } else if constexpr (Mode == PopMode::Wait) { + // Wait until the queue is not empty. + std::unique_lock lock{consumer.cv_mutex}; + consumer.cv.wait(lock, [this, read_index] { + return read_index != producer.index.load(std::memory_order::acquire); + }); } else { static_assert(Mode < PopMode::Count, "Invalid PopMode."); } diff --git a/src/core/hle/kernel/k_worker_task_manager.cpp b/src/core/hle/kernel/k_worker_task_manager.cpp index 9764d51b5f..e02e5a4020 100644 --- a/src/core/hle/kernel/k_worker_task_manager.cpp +++ b/src/core/hle/kernel/k_worker_task_manager.cpp @@ -35,7 +35,9 @@ KWorkerTaskManager::KWorkerTaskManager(KernelCore& kernel) { KWorkerTask* t; { std::unique_lock lk{m_task_mutex}; - m_task_cv.wait(lk); + m_task_cv.wait(lk, m_waiting_thread.get_stop_token(), [&]() { + return !m_task_queue.empty(); + }); if (stop_token.stop_requested()) break; t = m_task_queue.back(); diff --git a/src/core/hle/kernel/k_worker_task_manager.h b/src/core/hle/kernel/k_worker_task_manager.h index 00a3974d3f..91760ac036 100644 --- a/src/core/hle/kernel/k_worker_task_manager.h +++ b/src/core/hle/kernel/k_worker_task_manager.h @@ -32,7 +32,7 @@ private: std::jthread m_waiting_thread; std::mutex m_task_mutex; - std::condition_variable m_task_cv; + std::condition_variable_any m_task_cv; std::vector m_task_queue; }; diff --git a/src/qt_common/render/emu_thread.cpp b/src/qt_common/render/emu_thread.cpp index d5e5522837..81f992be9f 100644 --- a/src/qt_common/render/emu_thread.cpp +++ b/src/qt_common/render/emu_thread.cpp @@ -66,14 +66,17 @@ void EmuThread::run() { } else { QtCommon::system->Pause(); m_stopped.Set(); - EmulationPaused(lk); - m_should_run_cv.wait(lk, stop_token, [&] { return m_should_run; }); + m_should_run_cv.wait(lk, stop_token, [&] { + return m_should_run; + }); EmulationResumed(lk); } } // Shutdown the main emulated process + // Needs to pause first, we may not have paused before shutting down. + QtCommon::system->Pause(); QtCommon::system->DetachDebugger(); QtCommon::system->ShutdownMainProcess(); }