service/time: Remove reliance on the global system accessor
Eliminates usages of the global system accessor and instead passes the existing system instance into the interfaces.
This commit is contained in:
		@@ -20,8 +20,8 @@ namespace Service::Time {
 | 
			
		||||
 | 
			
		||||
class ISystemClock final : public ServiceFramework<ISystemClock> {
 | 
			
		||||
public:
 | 
			
		||||
    ISystemClock(Clock::SystemClockCore& clock_core)
 | 
			
		||||
        : ServiceFramework("ISystemClock"), clock_core{clock_core} {
 | 
			
		||||
    explicit ISystemClock(Clock::SystemClockCore& clock_core, Core::System& system)
 | 
			
		||||
        : ServiceFramework("ISystemClock"), clock_core{clock_core}, system{system} {
 | 
			
		||||
        // clang-format off
 | 
			
		||||
        static const FunctionInfo functions[] = {
 | 
			
		||||
            {0, &ISystemClock::GetCurrentTime, "GetCurrentTime"},
 | 
			
		||||
@@ -46,9 +46,8 @@ private:
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        s64 posix_time{};
 | 
			
		||||
        if (const ResultCode result{
 | 
			
		||||
                clock_core.GetCurrentTime(Core::System::GetInstance(), posix_time)};
 | 
			
		||||
            result != RESULT_SUCCESS) {
 | 
			
		||||
        if (const ResultCode result{clock_core.GetCurrentTime(system, posix_time)};
 | 
			
		||||
            result.IsError()) {
 | 
			
		||||
            IPC::ResponseBuilder rb{ctx, 2};
 | 
			
		||||
            rb.Push(result);
 | 
			
		||||
            return;
 | 
			
		||||
@@ -69,9 +68,8 @@ private:
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Clock::SystemClockContext system_clock_context{};
 | 
			
		||||
        if (const ResultCode result{
 | 
			
		||||
                clock_core.GetClockContext(Core::System::GetInstance(), system_clock_context)};
 | 
			
		||||
            result != RESULT_SUCCESS) {
 | 
			
		||||
        if (const ResultCode result{clock_core.GetClockContext(system, system_clock_context)};
 | 
			
		||||
            result.IsError()) {
 | 
			
		||||
            IPC::ResponseBuilder rb{ctx, 2};
 | 
			
		||||
            rb.Push(result);
 | 
			
		||||
            return;
 | 
			
		||||
@@ -83,12 +81,13 @@ private:
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Clock::SystemClockCore& clock_core;
 | 
			
		||||
    Core::System& system;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class ISteadyClock final : public ServiceFramework<ISteadyClock> {
 | 
			
		||||
public:
 | 
			
		||||
    ISteadyClock(Clock::SteadyClockCore& clock_core)
 | 
			
		||||
        : ServiceFramework("ISteadyClock"), clock_core{clock_core} {
 | 
			
		||||
    explicit ISteadyClock(Clock::SteadyClockCore& clock_core, Core::System& system)
 | 
			
		||||
        : ServiceFramework("ISteadyClock"), clock_core{clock_core}, system{system} {
 | 
			
		||||
        static const FunctionInfo functions[] = {
 | 
			
		||||
            {0, &ISteadyClock::GetCurrentTimePoint, "GetCurrentTimePoint"},
 | 
			
		||||
        };
 | 
			
		||||
@@ -105,14 +104,14 @@ private:
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const Clock::SteadyClockTimePoint time_point{
 | 
			
		||||
            clock_core.GetCurrentTimePoint(Core::System::GetInstance())};
 | 
			
		||||
        const Clock::SteadyClockTimePoint time_point{clock_core.GetCurrentTimePoint(system)};
 | 
			
		||||
        IPC::ResponseBuilder rb{ctx, (sizeof(Clock::SteadyClockTimePoint) / 4) + 2};
 | 
			
		||||
        rb.Push(RESULT_SUCCESS);
 | 
			
		||||
        rb.PushRaw(time_point);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Clock::SteadyClockCore& clock_core;
 | 
			
		||||
    Core::System& system;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
ResultCode Module::Interface::GetClockSnapshotFromSystemClockContextInternal(
 | 
			
		||||
@@ -134,7 +133,7 @@ ResultCode Module::Interface::GetClockSnapshotFromSystemClockContextInternal(
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const auto current_time_point{
 | 
			
		||||
        time_manager.GetStandardSteadyClockCore().GetCurrentTimePoint(Core::System::GetInstance())};
 | 
			
		||||
        time_manager.GetStandardSteadyClockCore().GetCurrentTimePoint(system)};
 | 
			
		||||
    if (const ResultCode result{Clock::ClockSnapshot::GetCurrentTime(
 | 
			
		||||
            clock_snapshot.user_time, current_time_point, clock_snapshot.user_context)};
 | 
			
		||||
        result != RESULT_SUCCESS) {
 | 
			
		||||
@@ -176,21 +175,24 @@ void Module::Interface::GetStandardUserSystemClock(Kernel::HLERequestContext& ct
 | 
			
		||||
    LOG_DEBUG(Service_Time, "called");
 | 
			
		||||
    IPC::ResponseBuilder rb{ctx, 2, 0, 1};
 | 
			
		||||
    rb.Push(RESULT_SUCCESS);
 | 
			
		||||
    rb.PushIpcInterface<ISystemClock>(module->GetTimeManager().GetStandardUserSystemClockCore());
 | 
			
		||||
    rb.PushIpcInterface<ISystemClock>(module->GetTimeManager().GetStandardUserSystemClockCore(),
 | 
			
		||||
                                      system);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Module::Interface::GetStandardNetworkSystemClock(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
    LOG_DEBUG(Service_Time, "called");
 | 
			
		||||
    IPC::ResponseBuilder rb{ctx, 2, 0, 1};
 | 
			
		||||
    rb.Push(RESULT_SUCCESS);
 | 
			
		||||
    rb.PushIpcInterface<ISystemClock>(module->GetTimeManager().GetStandardNetworkSystemClockCore());
 | 
			
		||||
    rb.PushIpcInterface<ISystemClock>(module->GetTimeManager().GetStandardNetworkSystemClockCore(),
 | 
			
		||||
                                      system);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Module::Interface::GetStandardSteadyClock(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
    LOG_DEBUG(Service_Time, "called");
 | 
			
		||||
    IPC::ResponseBuilder rb{ctx, 2, 0, 1};
 | 
			
		||||
    rb.Push(RESULT_SUCCESS);
 | 
			
		||||
    rb.PushIpcInterface<ISteadyClock>(module->GetTimeManager().GetStandardSteadyClockCore());
 | 
			
		||||
    rb.PushIpcInterface<ISteadyClock>(module->GetTimeManager().GetStandardSteadyClockCore(),
 | 
			
		||||
                                      system);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Module::Interface::GetTimeZoneService(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
@@ -204,7 +206,8 @@ void Module::Interface::GetStandardLocalSystemClock(Kernel::HLERequestContext& c
 | 
			
		||||
    LOG_DEBUG(Service_Time, "called");
 | 
			
		||||
    IPC::ResponseBuilder rb{ctx, 2, 0, 1};
 | 
			
		||||
    rb.Push(RESULT_SUCCESS);
 | 
			
		||||
    rb.PushIpcInterface<ISystemClock>(module->GetTimeManager().GetStandardLocalSystemClockCore());
 | 
			
		||||
    rb.PushIpcInterface<ISystemClock>(module->GetTimeManager().GetStandardLocalSystemClockCore(),
 | 
			
		||||
                                      system);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Module::Interface::IsStandardNetworkSystemClockAccuracySufficient(
 | 
			
		||||
@@ -228,8 +231,7 @@ void Module::Interface::CalculateMonotonicSystemClockBaseTimePoint(Kernel::HLERe
 | 
			
		||||
 | 
			
		||||
    IPC::RequestParser rp{ctx};
 | 
			
		||||
    const auto context{rp.PopRaw<Clock::SystemClockContext>()};
 | 
			
		||||
    const auto current_time_point{
 | 
			
		||||
        steady_clock_core.GetCurrentTimePoint(Core::System::GetInstance())};
 | 
			
		||||
    const auto current_time_point{steady_clock_core.GetCurrentTimePoint(system)};
 | 
			
		||||
 | 
			
		||||
    if (current_time_point.clock_source_id == context.steady_time_point.clock_source_id) {
 | 
			
		||||
        const auto ticks{Clock::TimeSpanType::FromTicks(
 | 
			
		||||
@@ -255,8 +257,8 @@ void Module::Interface::GetClockSnapshot(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
    Clock::SystemClockContext user_context{};
 | 
			
		||||
    if (const ResultCode result{
 | 
			
		||||
            module->GetTimeManager().GetStandardUserSystemClockCore().GetClockContext(
 | 
			
		||||
                Core::System::GetInstance(), user_context)};
 | 
			
		||||
        result != RESULT_SUCCESS) {
 | 
			
		||||
                system, user_context)};
 | 
			
		||||
        result.IsError()) {
 | 
			
		||||
        IPC::ResponseBuilder rb{ctx, 2};
 | 
			
		||||
        rb.Push(result);
 | 
			
		||||
        return;
 | 
			
		||||
@@ -264,8 +266,8 @@ void Module::Interface::GetClockSnapshot(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
    Clock::SystemClockContext network_context{};
 | 
			
		||||
    if (const ResultCode result{
 | 
			
		||||
            module->GetTimeManager().GetStandardNetworkSystemClockCore().GetClockContext(
 | 
			
		||||
                Core::System::GetInstance(), network_context)};
 | 
			
		||||
        result != RESULT_SUCCESS) {
 | 
			
		||||
                system, network_context)};
 | 
			
		||||
        result.IsError()) {
 | 
			
		||||
        IPC::ResponseBuilder rb{ctx, 2};
 | 
			
		||||
        rb.Push(result);
 | 
			
		||||
        return;
 | 
			
		||||
@@ -274,7 +276,7 @@ void Module::Interface::GetClockSnapshot(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
    Clock::ClockSnapshot clock_snapshot{};
 | 
			
		||||
    if (const ResultCode result{GetClockSnapshotFromSystemClockContextInternal(
 | 
			
		||||
            &ctx.GetThread(), user_context, network_context, type, clock_snapshot)};
 | 
			
		||||
        result != RESULT_SUCCESS) {
 | 
			
		||||
        result.IsError()) {
 | 
			
		||||
        IPC::ResponseBuilder rb{ctx, 2};
 | 
			
		||||
        rb.Push(result);
 | 
			
		||||
        return;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user