27 #include "precompiled.h"
40 static uintptr_t processorMask;
45 DWORD_PTR processAffinity, systemAffinity;
46 const BOOL ok = GetProcessAffinityMask(hProcess, &processAffinity, &systemAffinity);
48 ENSURE(processAffinity != 0);
49 processorMask = processAffinity;
58 static size_t numProcessors;
67 ENSURE(numProcessors <= (
size_t)si.dwNumberOfProcessors);
68 ENSURE(numProcessors >= 1);
80 if(RegOpenKeyExW(HKEY_LOCAL_MACHINE, L
"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0", 0, KEY_QUERY_VALUE, &hKey) != ERROR_SUCCESS)
83 DWORD size =
sizeof(freqMhz);
84 LONG ret = RegQueryValueExW(hKey, L
"~MHz", 0, 0, (LPBYTE)&freqMhz, &size);
88 if(ret != ERROR_SUCCESS)
97 static size_t systemPageSize;
103 systemPageSize = (size_t)si.dwPageSize;
106 return systemPageSize;
114 if(largePageSize == ~(
size_t)0)
116 WUTIL_FUNC(pGetLargePageMinimum, SIZE_T, (
void));
118 if(pGetLargePageMinimum)
120 largePageSize = pGetLargePageMinimum();
121 ENSURE(largePageSize != 0);
138 mse.dwLength =
sizeof(mse);
139 const BOOL ok = GlobalMemoryStatusEx(&mse);
147 DWORDLONG memorySize = mse.ullTotalPhys;
154 memorySize =
round_up(memorySize, DWORDLONG(1*
MiB));
156 return size_t(memorySize /
MiB);
163 const size_t memoryAvailableMiB = size_t(mse.ullAvailPhys /
MiB);
164 return memoryAvailableMiB;
172 DWORD_PTR affinity = 0;
174 size_t processor = (size_t)-1;
177 if(
IsBitSet(processAffinity, processorNumber))
181 if(
IsBitSet(processorMask, processor))
182 affinity |= DWORD_PTR(1) << processorNumber;
191 uintptr_t processorMask = 0;
193 size_t processor = (size_t)-1;
196 if(
IsBitSet(processAffinity, processorNumber))
200 if(
IsBitSet(affinity, processorNumber))
201 processorMask |= uintptr_t(1) << processor;
205 return processorMask;
213 DWORD currentProcessor;
219 if(pGetCurrentProcessorNumber)
220 currentProcessor = pGetCurrentProcessorNumber();
238 ENSURE(numProcessors ==
sizeof(processorMask)*CHAR_BIT || (processorMask >> numProcessors) == 0);
240 DWORD_PTR processAffinity, systemAffinity;
241 const BOOL ok = GetProcessAffinityMask(GetCurrentProcess(), &processAffinity, &systemAffinity);
245 const DWORD_PTR previousAffinity = SetThreadAffinityMask(GetCurrentThread(), affinity);
246 ENSURE(previousAffinity != 0);
251 return previousProcessorMask;
258 DWORD_PTR processAffinity, systemAffinity;
260 const BOOL ok = GetProcessAffinityMask(GetCurrentProcess(), &processAffinity, &systemAffinity);
262 if(processAffinity != systemAffinity)
270 const uintptr_t processorMask = uintptr_t(1) << processor;
272 cb(processor, cbData);
size_t os_cpu_QueryMemorySize()
#define WUTIL_FUNC(varName, ret, params)
static const size_t os_cpu_MaxProcessors
maximum number of processors supported by the OS (determined by the number of bits in an affinity mas...
Status os_cpu_CallByEachCPU(OsCpuCallback cb, uintptr_t cbData)
execute the specified function once on each processor.
T round_up(T n, T multiple)
round number up/down to the next given multiple.
static size_t PopulationCount(T x)
const Status OS_CPU_RESTRICTED_AFFINITY
size_t os_cpu_NumProcessors()
size_t os_cpu_LargePageSize()
uintptr_t os_cpu_SetThreadAffinityMask(uintptr_t processorMask)
restrict the current thread to a set of processors.
const Status NOT_SUPPORTED
static void VerifyRunningOnCorrectProcessors(DWORD_PTR affinity)
#define ENSURE(expr)
ensure the expression <expr> evaluates to non-zero.
static void GetMemoryStatus(MEMORYSTATUSEX &mse)
bool IsBitSet(T value, size_t index)
size_t os_cpu_MemoryAvailable()
uintptr_t wcpu_ProcessorMaskFromAffinity(DWORD_PTR processAffinity, DWORD_PTR affinity)
i64 Status
Error handling system.
uintptr_t os_cpu_ProcessorMask()
#define WARN_IF_FALSE(expression)
static const size_t largePageSize
DWORD_PTR wcpu_AffinityFromProcessorMask(DWORD_PTR processAffinity, uintptr_t processorMask)
#define WARN_RETURN(status)
Status wcpu_ReadFrequencyFromRegistry(u32 &freqMhz)
void(* OsCpuCallback)(size_t processor, uintptr_t cbData)
called by os_cpu_CallByEachCPU.
#define WUTIL_IMPORT_KERNEL32(procName, varName)