diff --git a/Include/Aurora/HWInfo/CpuLoadSampler.hpp b/Include/Aurora/HWInfo/CpuLoadSampler.hpp index 46565567..4c198e4a 100644 --- a/Include/Aurora/HWInfo/CpuLoadSampler.hpp +++ b/Include/Aurora/HWInfo/CpuLoadSampler.hpp @@ -6,7 +6,8 @@ Author: Reece Note: This API does not query system-wide CPU utilization - This belongs alongside AuProcess just about as much as our memory stat APIs do. I think it's fine to keep hardware perf query apis under AuHwInfo. + These APIs belong to the AuProcess subsystem just about as much as our memory-usage stat APIs do. + (I think it's fine to keep hardware perf query apis under AuHwInfo, even if they are process rel) ***/ #pragma once @@ -28,4 +29,5 @@ namespace Aurora::HWInfo bool bCountKernelUsage = false); // False = Ignore kernel work under our callstack AUKN_SYM double GetProcessCPUUtilization(); + AUKN_SYM double GetThreadCPUUtilization(AuOptional optIncludeKernel = { true }); } \ No newline at end of file diff --git a/Source/HWInfo/AuCpuLoadSampler.cpp b/Source/HWInfo/AuCpuLoadSampler.cpp index d8f4feff..403db5dc 100644 --- a/Source/HWInfo/AuCpuLoadSampler.cpp +++ b/Source/HWInfo/AuCpuLoadSampler.cpp @@ -10,6 +10,13 @@ namespace Aurora::HWInfo { + static thread_local CpuLoadSamplerImpl tlsThreadLocalUsageSamplers[2] { + CpuLoadSamplerImpl(AuSToMS(1), true, false), + CpuLoadSamplerImpl(AuSToMS(1), true, true) + }; + + static CpuLoadSamplerImpl gProcessUsageSampler(AuSToMS(1), false, true); + CpuLoadSamplerImpl::CpuLoadSamplerImpl(AuUInt32 uMinSamplePeriodMS, bool bThreadMode, bool bCountKernelUsage) : @@ -112,8 +119,12 @@ namespace Aurora::HWInfo AUKN_SYM double GetProcessCPUUtilization() { - static CpuLoadSamplerImpl gSampler(AuSToMS(1), false, false); - return gSampler.GetLoad(); + return gProcessUsageSampler.GetLoad(); + } + + AUKN_SYM double GetThreadCPUUtilization(AuOptional optIncludeKernel) + { + return tlsThreadLocalUsageSamplers[optIncludeKernel.value_or(true)].GetLoad(); } AUKN_SYM ICpuLoadSampler *CpuLoadSamplerNew(AuUInt32 uMinSamplePeriodMS,