[+] AuTime::GetClockUserAndKernelTimeNS
This commit is contained in:
parent
7bc533b710
commit
f310fa9aae
@ -44,6 +44,11 @@ namespace Aurora::Time
|
|||||||
*/
|
*/
|
||||||
AUKN_SYM AuUInt64 SteadyClockJiffies();
|
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
|
* @brief frequency in jiffies per second
|
||||||
*/
|
*/
|
||||||
|
@ -226,6 +226,19 @@ namespace Aurora::Time
|
|||||||
|
|
||||||
return GetPOSIXTimeEx(&usage, e);
|
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)
|
#if !defined(CLOCK_THREAD_CPUTIME_ID)
|
||||||
#define CLOCK_THREAD_CPUTIME_ID 0
|
#define CLOCK_THREAD_CPUTIME_ID 0
|
||||||
@ -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(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(ThreadKernel, Thread, (ullKernel.QuadPart), 0, (true, EPseudoPosixClock::eKernel));
|
||||||
ADD_CLOCK_FAMILY(ThreadUser, Thread, (ullUser.QuadPart), /*CLOCK_THREAD_CPUTIME_ID*/0, (true, EPseudoPosixClock::eUser));
|
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