From 97d0c6242368f443c50395b2fa9d99a59f1df1e8 Mon Sep 17 00:00:00 2001 From: Thomas Guillemard Date: Sun, 14 Jul 2019 22:50:11 +0200 Subject: Accurately implement steady & system clocks (#732) * Improve SteadyClock implementation accuracy * Rewrite system clocks to be accurate * Implement IStaticService 100 & 101 * Add time:* permissions * Address comments * Realign TimePermissions definitions * Address gdk's comments * Fix after rebase --- .../Time/Clock/StandardUserSystemClockCore.cs | 96 ++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 Ryujinx.HLE/HOS/Services/Time/Clock/StandardUserSystemClockCore.cs (limited to 'Ryujinx.HLE/HOS/Services/Time/Clock/StandardUserSystemClockCore.cs') diff --git a/Ryujinx.HLE/HOS/Services/Time/Clock/StandardUserSystemClockCore.cs b/Ryujinx.HLE/HOS/Services/Time/Clock/StandardUserSystemClockCore.cs new file mode 100644 index 00000000..00f296ad --- /dev/null +++ b/Ryujinx.HLE/HOS/Services/Time/Clock/StandardUserSystemClockCore.cs @@ -0,0 +1,96 @@ +using Ryujinx.HLE.HOS.Kernel.Threading; + +namespace Ryujinx.HLE.HOS.Services.Time.Clock +{ + class StandardUserSystemClockCore : SystemClockCore + { + private StandardLocalSystemClockCore _localSystemClockCore; + private StandardNetworkSystemClockCore _networkSystemClockCore; + private bool _autoCorrectionEnabled; + + private static StandardUserSystemClockCore instance; + + public static StandardUserSystemClockCore Instance + { + get + { + if (instance == null) + { + instance = new StandardUserSystemClockCore(StandardLocalSystemClockCore.Instance, StandardNetworkSystemClockCore.Instance); + } + + return instance; + } + } + + public StandardUserSystemClockCore(StandardLocalSystemClockCore localSystemClockCore, StandardNetworkSystemClockCore networkSystemClockCore) + { + _localSystemClockCore = localSystemClockCore; + _networkSystemClockCore = networkSystemClockCore; + _autoCorrectionEnabled = false; + } + + public override ResultCode Flush(SystemClockContext context) + { + return ResultCode.NotImplemented; + } + + public override SteadyClockCore GetSteadyClockCore() + { + return _localSystemClockCore.GetSteadyClockCore(); + } + + public override ResultCode GetSystemClockContext(KThread thread, out SystemClockContext context) + { + ResultCode result = ApplyAutomaticCorrection(thread, false); + + context = new SystemClockContext(); + + if (result == ResultCode.Success) + { + return _localSystemClockCore.GetSystemClockContext(thread, out context); + } + + return result; + } + + public override ResultCode SetSystemClockContext(SystemClockContext context) + { + return ResultCode.NotImplemented; + } + + private ResultCode ApplyAutomaticCorrection(KThread thread, bool autoCorrectionEnabled) + { + ResultCode result = ResultCode.Success; + + if (_autoCorrectionEnabled != autoCorrectionEnabled && _networkSystemClockCore.IsClockSetup(thread)) + { + result = _networkSystemClockCore.GetSystemClockContext(thread, out SystemClockContext context); + + if (result == ResultCode.Success) + { + _localSystemClockCore.SetSystemClockContext(context); + } + } + + return result; + } + + public ResultCode SetAutomaticCorrectionEnabled(KThread thread, bool autoCorrectionEnabled) + { + ResultCode result = ApplyAutomaticCorrection(thread, autoCorrectionEnabled); + + if (result == ResultCode.Success) + { + _autoCorrectionEnabled = autoCorrectionEnabled; + } + + return result; + } + + public bool IsAutomaticCorrectionEnabled() + { + return _autoCorrectionEnabled; + } + } +} -- cgit v1.2.3