mirror of
https://github.com/yuzu-emu/yuzu.git
synced 2024-06-12 16:10:03 +00:00
51 lines
1.6 KiB
C++
51 lines
1.6 KiB
C++
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
#include "core/core.h"
|
|
#include "core/hle/service/psc/time/power_state_request_manager.h"
|
|
|
|
namespace Service::PSC::Time {
|
|
|
|
PowerStateRequestManager::PowerStateRequestManager(Core::System& system)
|
|
: m_system{system}, m_ctx{system, "Psc:PowerStateRequestManager"},
|
|
m_event{m_ctx.CreateEvent("Psc:PowerStateRequestManager:Event")} {}
|
|
|
|
PowerStateRequestManager::~PowerStateRequestManager() {
|
|
m_ctx.CloseEvent(m_event);
|
|
}
|
|
|
|
void PowerStateRequestManager::UpdatePendingPowerStateRequestPriority(u32 priority) {
|
|
std::scoped_lock l{m_mutex};
|
|
if (m_has_pending_request) {
|
|
m_pending_request_priority = std::max(m_pending_request_priority, priority);
|
|
} else {
|
|
m_pending_request_priority = priority;
|
|
m_has_pending_request = true;
|
|
}
|
|
}
|
|
|
|
void PowerStateRequestManager::SignalPowerStateRequestAvailability() {
|
|
std::scoped_lock l{m_mutex};
|
|
if (m_has_pending_request) {
|
|
if (!m_has_available_request) {
|
|
m_has_available_request = true;
|
|
}
|
|
m_has_pending_request = false;
|
|
m_available_request_priority = m_pending_request_priority;
|
|
m_event->Signal();
|
|
}
|
|
}
|
|
|
|
bool PowerStateRequestManager::GetAndClearPowerStateRequest(u32& out_priority) {
|
|
std::scoped_lock l{m_mutex};
|
|
auto had_request{m_has_available_request};
|
|
if (m_has_available_request) {
|
|
out_priority = m_available_request_priority;
|
|
m_has_available_request = false;
|
|
m_event->Clear();
|
|
}
|
|
return had_request;
|
|
}
|
|
|
|
} // namespace Service::PSC::Time
|