[+] AuTime::GetClockUserAndKernelTimeNS
This commit is contained in:
parent
7bc533b710
commit
f310fa9aae
@ -44,6 +44,11 @@ namespace Aurora::Time
|
||||
*/
|
||||
AUKN_SYM AuUInt64 SteadyClockJiffies();
|
||||
|
||||
/**
|
||||
* @return { time spent in userland, time spent in kernelland }
|
||||
*/
|
||||
AUKN_SYM AuPair<AuUInt64, AuUInt64> GetClockUserAndKernelTimeNS(EClock clock);
|
||||
|
||||
/**
|
||||
* @brief frequency in jiffies per second
|
||||
*/
|
||||
|
@ -227,6 +227,19 @@ namespace Aurora::Time
|
||||
return GetPOSIXTimeEx(&usage, e);
|
||||
}
|
||||
|
||||
static AuPair<AuUInt64, AuUInt64> GetPOSIXTimePair(bool bThread)
|
||||
{
|
||||
struct rusage usage;
|
||||
|
||||
getrusage(bThread ? RUSAGE_THREAD : RUSAGE_SELF,
|
||||
&usage);
|
||||
|
||||
return {
|
||||
GetPOSIXTimeEx(&usage, EPseudoPosixClock::eKernel),
|
||||
GetPOSIXTimeEx(&usage, EPseudoPosixClock::eUser)
|
||||
};
|
||||
}
|
||||
|
||||
#if !defined(CLOCK_THREAD_CPUTIME_ID)
|
||||
#define CLOCK_THREAD_CPUTIME_ID 0
|
||||
#endif
|
||||
@ -392,4 +405,84 @@ namespace Aurora::Time
|
||||
ADD_CLOCK_FAMILY(Thread, Thread, (ullUser.QuadPart + ullKernel.QuadPart), /*CLOCK_THREAD_CPUTIME_ID*/0, (true, EPseudoPosixClock::eAll));
|
||||
ADD_CLOCK_FAMILY(ThreadKernel, Thread, (ullKernel.QuadPart), 0, (true, EPseudoPosixClock::eKernel));
|
||||
ADD_CLOCK_FAMILY(ThreadUser, Thread, (ullUser.QuadPart), /*CLOCK_THREAD_CPUTIME_ID*/0, (true, EPseudoPosixClock::eUser));
|
||||
|
||||
#if defined(AURORA_IS_MODERNNT_DERIVED)
|
||||
|
||||
#define ADD_CLOCK_FAMILY_PAIR(type, bIsThread, exprA, exprB) \
|
||||
\
|
||||
static AuPair<AuUInt64, AuUInt64> type ## ClockPairNS() \
|
||||
{ \
|
||||
FILETIME creation, exit, kernel, user; \
|
||||
if (::Get ## type ## Times(GetCurrent ## type(), &creation, &exit, &kernel, &user)) \
|
||||
{ \
|
||||
ULARGE_INTEGER ullUser; \
|
||||
{ \
|
||||
ullUser.LowPart = user.dwLowDateTime; \
|
||||
ullUser.HighPart = user.dwHighDateTime; \
|
||||
} \
|
||||
\
|
||||
ULARGE_INTEGER ullKernel; \
|
||||
{ \
|
||||
ullKernel.LowPart = kernel.dwLowDateTime; \
|
||||
ullKernel.HighPart = kernel.dwHighDateTime; \
|
||||
} \
|
||||
return AuMakePair((exprA) * 100ull, (exprB) * 100ull); \
|
||||
} \
|
||||
return {}; \
|
||||
} \
|
||||
|
||||
#elif defined(AURORA_IS_POSIX_DERIVED)
|
||||
|
||||
#define ADD_CLOCK_FAMILY_PAIR(type, bIsThread, exprA, exprB) \
|
||||
\
|
||||
static AuPair<AuUInt64, AuUInt64> type ## ClockPairNS() \
|
||||
{ \
|
||||
return GetPOSIXTimePair(bIsThread); \
|
||||
} \
|
||||
|
||||
#else
|
||||
|
||||
#define ADD_CLOCK_FAMILY_PAIR(type, bIsThread, exprA, exprB) \
|
||||
\
|
||||
static AuPair<AuUInt64, AuUInt64> type ## ClockPairNS() \
|
||||
{ \
|
||||
return {}; \
|
||||
} \
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
ADD_CLOCK_FAMILY_PAIR(Thread, true, (ullKernel.QuadPart),
|
||||
(ullUser.QuadPart));
|
||||
|
||||
ADD_CLOCK_FAMILY_PAIR(Process, false, (ullKernel.QuadPart),
|
||||
(ullUser.QuadPart));
|
||||
|
||||
AUKN_SYM AuPair<AuUInt64, AuUInt64> GetClockUserAndKernelTimeNS(EClock clock)
|
||||
{
|
||||
AuPair<AuUInt64, AuUInt64> swizzle;
|
||||
|
||||
switch (clock)
|
||||
{
|
||||
case EClock::eWall:
|
||||
case EClock::eSteady:
|
||||
SysPushErrorArg("Invalid clock");
|
||||
return {};
|
||||
case EClock::eProcessTime:
|
||||
case EClock::eProcessUserTime:
|
||||
case EClock::eProcessKernelTime:
|
||||
swizzle = ProcessClockPairNS();
|
||||
break;
|
||||
case EClock::eThreadTime:
|
||||
case EClock::eThreadUserTime:
|
||||
case EClock::eThreadKernelTime:
|
||||
swizzle = ThreadClockPairNS();
|
||||
break;
|
||||
default:
|
||||
SysPushErrorArg("Invalid clock");
|
||||
return {};
|
||||
}
|
||||
|
||||
return { swizzle.second, swizzle.first };
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user