/*** Copyright (C) 2023 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: AuClocks.cpp Date: 2023-3-21 Author: Reece ***/ #include #include "AuClocks.hpp" namespace Aurora::Time { #define ADD_CLOCK(name, enum, jiffies, getNs, getMs) \ struct name ## Clock_t : IClock \ { \ EClock GetType() override \ { \ return EClock::enum; \ } \ \ AuUInt64 GetHertz() override \ { \ return jiffies(); \ } \ \ AuUInt64 NowNS() override \ { \ return getNs(); \ } \ \ AuUInt64 NowMS() override \ { \ return getMs(); \ } \ }; \ \ static name ## Clock_t gClock## name ## Instance; \ \ AUKN_SYM AuSPtr Get ## name ## Clock() \ { \ return AuUnsafeRaiiToShared(&gClock## name ## Instance); \ } #define FILE_AND_USR_DIR_STEP (AuMSToNS(AuSToMS(1)) / 100ull) ADD_CLOCK(Steady, eSteady, SteadyClockJiffies, SteadyClockNS, SteadyClockMS); ADD_CLOCK(Wall, eWall, FILE_AND_USR_DIR_STEP + AuUInt64, CurrentClockNS, CurrentClockMS); ADD_CLOCK(Process, eProcessTime, ProcessClockJiffies, ProcessClockNS, ProcessClockMS); ADD_CLOCK(ProcessKernel, eProcessKernelTime, ProcessKernelClockJiffies, ProcessKernelClockNS, ProcessKernelClockMS); ADD_CLOCK(ProcessUser, eProcessUserTime, ProcessUserClockJiffies, ProcessUserClockNS, ProcessUserClockMS); ADD_CLOCK(Thread, eThreadTime, ThreadClockJiffies, ThreadClockNS, ThreadClockMS); ADD_CLOCK(ThreadKernel, eThreadKernelTime, ThreadKernelClockJiffies, ThreadKernelClockNS, ThreadKernelClockMS); ADD_CLOCK(ThreadUser, eThreadUserTime, ThreadUserClockJiffies, ThreadUserClockNS, ThreadUserClockMS); #undef ADD_CLOCK AUKN_SYM AuSPtr GetClockFromEnum(EClock clock) { switch (clock) { case EClock::eWall: return GetWallClock(); case EClock::eSteady: return GetSteadyClock(); case EClock::eProcessTime: return GetProcessClock(); case EClock::eProcessUserTime: return GetProcessUserClock(); case EClock::eProcessKernelTime: return GetProcessKernelClock(); case EClock::eThreadTime: return GetThreadClock(); case EClock::eThreadUserTime: return GetThreadUserClock(); case EClock::eThreadKernelTime: return GetThreadKernelClock(); default: SysPushErrorArg("Invalid clock"); return {}; } } AUKN_SYM AuUInt64 QueryClockTimeNS(EClock clock) { switch (clock) { case EClock::eWall: return CurrentClockNS(); case EClock::eSteady: return SteadyClockNS(); case EClock::eProcessTime: return ProcessClockNS(); case EClock::eProcessUserTime: return ProcessUserClockNS(); case EClock::eProcessKernelTime: return ProcessKernelClockNS(); case EClock::eThreadTime: return ThreadClockNS(); case EClock::eThreadUserTime: return ThreadUserClockNS(); case EClock::eThreadKernelTime: return ThreadKernelClockNS(); default: SysPushErrorArg("Invalid clock"); return {}; } } AUKN_SYM AuUInt64 QueryClockFrequency(EClock clock) { switch (clock) { case EClock::eWall: return FILE_AND_USR_DIR_STEP; case EClock::eSteady: return SteadyClockJiffies(); case EClock::eProcessTime: case EClock::eProcessUserTime: case EClock::eProcessKernelTime: return ProcessClockJiffies(); case EClock::eThreadTime: case EClock::eThreadUserTime: case EClock::eThreadKernelTime: return ThreadClockJiffies(); default: SysPushErrorArg("Invalid clock"); return {}; } } #undef FILE_AND_USR_DIR_STEP }