84 lines
2.3 KiB
C++
Executable File
84 lines
2.3 KiB
C++
Executable File
// 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/clocks/context_writers.h"
|
|
|
|
namespace Service::PSC::Time {
|
|
|
|
void ContextWriter::SignalAllNodes() {
|
|
std::scoped_lock l{m_mutex};
|
|
for (auto& operation : m_operation_events) {
|
|
operation.m_event->Signal();
|
|
}
|
|
}
|
|
|
|
void ContextWriter::Link(OperationEvent& operation_event) {
|
|
std::scoped_lock l{m_mutex};
|
|
m_operation_events.push_back(operation_event);
|
|
}
|
|
|
|
LocalSystemClockContextWriter::LocalSystemClockContextWriter(Core::System& system,
|
|
SharedMemory& shared_memory)
|
|
: m_system{system}, m_shared_memory{shared_memory} {}
|
|
|
|
Result LocalSystemClockContextWriter::Write(SystemClockContext& context) {
|
|
if (m_in_use) {
|
|
R_SUCCEED_IF(context == m_context);
|
|
m_context = context;
|
|
} else {
|
|
m_context = context;
|
|
m_in_use = true;
|
|
}
|
|
|
|
m_shared_memory.SetLocalSystemContext(context);
|
|
|
|
SignalAllNodes();
|
|
|
|
R_SUCCEED();
|
|
}
|
|
|
|
NetworkSystemClockContextWriter::NetworkSystemClockContextWriter(Core::System& system,
|
|
SharedMemory& shared_memory,
|
|
SystemClockCore& system_clock)
|
|
: m_system{system}, m_shared_memory{shared_memory}, m_system_clock{system_clock} {}
|
|
|
|
Result NetworkSystemClockContextWriter::Write(SystemClockContext& context) {
|
|
s64 time{};
|
|
[[maybe_unused]] auto res = m_system_clock.GetCurrentTime(&time);
|
|
|
|
if (m_in_use) {
|
|
R_SUCCEED_IF(context == m_context);
|
|
m_context = context;
|
|
} else {
|
|
m_context = context;
|
|
m_in_use = true;
|
|
}
|
|
|
|
m_shared_memory.SetNetworkSystemContext(context);
|
|
|
|
SignalAllNodes();
|
|
|
|
R_SUCCEED();
|
|
}
|
|
|
|
EphemeralNetworkSystemClockContextWriter::EphemeralNetworkSystemClockContextWriter(
|
|
Core::System& system)
|
|
: m_system{system} {}
|
|
|
|
Result EphemeralNetworkSystemClockContextWriter::Write(SystemClockContext& context) {
|
|
if (m_in_use) {
|
|
R_SUCCEED_IF(context == m_context);
|
|
m_context = context;
|
|
} else {
|
|
m_context = context;
|
|
m_in_use = true;
|
|
}
|
|
|
|
SignalAllNodes();
|
|
|
|
R_SUCCEED();
|
|
}
|
|
|
|
} // namespace Service::PSC::Time
|