68 lines
3.0 KiB
C++
68 lines
3.0 KiB
C++
|
/***
|
||
|
Copyright (C) 2023 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||
|
|
||
|
File: AuClocks.cpp
|
||
|
Date: 2023-3-21
|
||
|
Author: Reece
|
||
|
***/
|
||
|
#include <RuntimeInternal.hpp>
|
||
|
#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<IClock> Get ## name ## Clock() \
|
||
|
{ \
|
||
|
return AuUnsafeRaiiToShared(&gClock## name ## Instance); \
|
||
|
}
|
||
|
|
||
|
#define FILE_AND_USR_DIR_STEP (AuMSToNS<AuUInt64>(AuSToMS<AuUInt64>(1)) / 100ull)
|
||
|
|
||
|
ADD_CLOCK(Steady, eSteady, SteadyClockJiffies, SteadyClockNS, SteadyClockMS);
|
||
|
ADD_CLOCK(Wall, eWall, FILE_AND_USR_DIR_STEP + AuUInt64, CurrentClockNS, CurrentClockMS);
|
||
|
ADD_CLOCK(ProcTime, eProcessTime, HighResClockJiffies, HighResClockNS, HighResClockMS);
|
||
|
|
||
|
#undef FILE_AND_USR_DIR_STEP
|
||
|
#undef ADD_CLOCK
|
||
|
|
||
|
AUKN_SYM AuSPtr<IClock> GetClockFromEnum(EClock clock)
|
||
|
{
|
||
|
switch (clock)
|
||
|
{
|
||
|
case EClock::eWall:
|
||
|
return GetWallClock();
|
||
|
case EClock::eProcessTime:
|
||
|
return GetProcessClock();
|
||
|
case EClock::eSteady:
|
||
|
return GetSteadyClock();
|
||
|
default:
|
||
|
SysPushErrorArg("Invalid clock");
|
||
|
return {};
|
||
|
}
|
||
|
}
|
||
|
}
|