pineapple-src/src/core/hle/service/psc/time/clocks/system_clock_core.cpp

76 lines
2.0 KiB
C++
Executable File

// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include "core/hle/service/psc/time/clocks/context_writers.h"
#include "core/hle/service/psc/time/clocks/system_clock_core.h"
namespace Service::PSC::Time {
bool SystemClockCore::CheckClockSourceMatches() {
SystemClockContext context{};
if (GetContext(context) != ResultSuccess) {
return false;
}
SteadyClockTimePoint time_point{};
if (m_steady_clock.GetCurrentTimePoint(time_point) != ResultSuccess) {
return false;
}
return context.steady_time_point.IdMatches(time_point);
}
Result SystemClockCore::GetCurrentTime(s64* out_time) const {
R_UNLESS(out_time != nullptr, ResultInvalidArgument);
SystemClockContext context{};
SteadyClockTimePoint time_point{};
R_TRY(m_steady_clock.GetCurrentTimePoint(time_point));
R_TRY(GetContext(context));
R_UNLESS(context.steady_time_point.IdMatches(time_point), ResultClockMismatch);
*out_time = context.offset + time_point.time_point;
R_SUCCEED();
}
Result SystemClockCore::SetCurrentTime(s64 time) {
SteadyClockTimePoint time_point{};
R_TRY(m_steady_clock.GetCurrentTimePoint(time_point));
SystemClockContext context{
.offset = time - time_point.time_point,
.steady_time_point = time_point,
};
R_RETURN(SetContextAndWrite(context));
}
Result SystemClockCore::GetContext(SystemClockContext& out_context) const {
out_context = m_context;
R_SUCCEED();
}
Result SystemClockCore::SetContext(SystemClockContext& context) {
m_context = context;
R_SUCCEED();
}
Result SystemClockCore::SetContextAndWrite(SystemClockContext& context) {
R_TRY(SetContext(context));
if (m_context_writer) {
R_RETURN(m_context_writer->Write(context));
}
R_SUCCEED();
}
void SystemClockCore::LinkOperationEvent(OperationEvent& operation_event) {
if (m_context_writer) {
m_context_writer->Link(operation_event);
}
}
} // namespace Service::PSC::Time