diff options
Diffstat (limited to 'src/core/hle')
| -rw-r--r-- | src/core/hle/kernel/scheduler.cpp | 21 | ||||
| -rw-r--r-- | src/core/hle/service/am/am.cpp | 20 |
2 files changed, 26 insertions, 15 deletions
diff --git a/src/core/hle/kernel/scheduler.cpp b/src/core/hle/kernel/scheduler.cpp index 2b12c0dbf..7b929781c 100644 --- a/src/core/hle/kernel/scheduler.cpp +++ b/src/core/hle/kernel/scheduler.cpp @@ -6,6 +6,7 @@ // licensed under GPLv2 or later under exception provided by the author. #include <algorithm> +#include <mutex> #include <set> #include <unordered_set> #include <utility> @@ -31,22 +32,20 @@ GlobalScheduler::GlobalScheduler(KernelCore& kernel) : kernel{kernel} {} GlobalScheduler::~GlobalScheduler() = default; void GlobalScheduler::AddThread(std::shared_ptr<Thread> thread) { - global_list_guard.lock(); + std::scoped_lock lock{global_list_guard}; thread_list.push_back(std::move(thread)); - global_list_guard.unlock(); } void GlobalScheduler::RemoveThread(std::shared_ptr<Thread> thread) { - global_list_guard.lock(); + std::scoped_lock lock{global_list_guard}; thread_list.erase(std::remove(thread_list.begin(), thread_list.end(), thread), thread_list.end()); - global_list_guard.unlock(); } u32 GlobalScheduler::SelectThreads() { ASSERT(is_locked); const auto update_thread = [](Thread* thread, Scheduler& sched) { - sched.guard.lock(); + std::scoped_lock lock{sched.guard}; if (thread != sched.selected_thread_set.get()) { if (thread == nullptr) { ++sched.idle_selection_count; @@ -57,7 +56,6 @@ u32 GlobalScheduler::SelectThreads() { sched.is_context_switch_pending || (sched.selected_thread_set != sched.current_thread); sched.is_context_switch_pending = reschedule_pending; std::atomic_thread_fence(std::memory_order_seq_cst); - sched.guard.unlock(); return reschedule_pending; }; if (!is_reselection_pending.load()) { @@ -757,11 +755,12 @@ void Scheduler::OnSwitch(void* this_scheduler) { void Scheduler::SwitchToCurrent() { while (true) { - guard.lock(); - selected_thread = selected_thread_set; - current_thread = selected_thread; - is_context_switch_pending = false; - guard.unlock(); + { + std::scoped_lock lock{guard}; + selected_thread = selected_thread_set; + current_thread = selected_thread; + is_context_switch_pending = false; + } while (!is_context_switch_pending) { if (current_thread != nullptr && !current_thread->IsHLEThread()) { current_thread->context_guard.lock(); diff --git a/src/core/hle/service/am/am.cpp b/src/core/hle/service/am/am.cpp index 2642c24cc..c688d6d98 100644 --- a/src/core/hle/service/am/am.cpp +++ b/src/core/hle/service/am/am.cpp @@ -10,6 +10,7 @@ #include "core/core.h" #include "core/file_sys/control_metadata.h" #include "core/file_sys/patch_manager.h" +#include "core/file_sys/registered_cache.h" #include "core/file_sys/savedata_factory.h" #include "core/hle/ipc_helpers.h" #include "core/hle/kernel/kernel.h" @@ -1371,14 +1372,25 @@ void IApplicationFunctions::GetDisplayVersion(Kernel::HLERequestContext& ctx) { std::array<u8, 0x10> version_string{}; - FileSys::PatchManager pm{system.CurrentProcess()->GetTitleID()}; - const auto res = pm.GetControlMetadata(); + const auto res = [this] { + const auto title_id = system.CurrentProcess()->GetTitleID(); + + FileSys::PatchManager pm{title_id}; + auto res = pm.GetControlMetadata(); + if (res.first != nullptr) { + return res; + } + + FileSys::PatchManager pm_update{FileSys::GetUpdateTitleID(title_id)}; + return pm_update.GetControlMetadata(); + }(); + if (res.first != nullptr) { const auto& version = res.first->GetVersionString(); std::copy(version.begin(), version.end(), version_string.begin()); } else { - constexpr u128 default_version = {1, 0}; - std::memcpy(version_string.data(), default_version.data(), sizeof(u128)); + constexpr char default_version[]{"1.0.0"}; + std::memcpy(version_string.data(), default_version, sizeof(default_version)); } IPC::ResponseBuilder rb{ctx, 6}; |
