mirror of
https://github.com/odin-lang/Odin.git
synced 2026-04-19 04:50:29 +00:00
35 lines
1.1 KiB
Odin
35 lines
1.1 KiB
Odin
package sysinfo
|
|
|
|
import sys "core:sys/windows"
|
|
import "base:intrinsics"
|
|
|
|
@(private)
|
|
_cpu_core_count :: proc "contextless" () -> (physical: int, logical: int, ok: bool) {
|
|
// Reportedly, Windows Server supports a maximum of 256 logical cores.
|
|
// The most scratch memory we need therefore is 8192 bytes = 256 * size_of(sys.SYSTEM_LOGICAL_PROCESSOR_INFORMATION)
|
|
infos: [256]sys.SYSTEM_LOGICAL_PROCESSOR_INFORMATION
|
|
|
|
// Query for the required buffer size.
|
|
returned_length: sys.DWORD
|
|
sys.GetLogicalProcessorInformation(nil, &returned_length)
|
|
|
|
if int(returned_length) > size_of(infos) {
|
|
return 0, 0, false
|
|
}
|
|
|
|
count := int(returned_length) / size_of(sys.SYSTEM_LOGICAL_PROCESSOR_INFORMATION)
|
|
|
|
// If it still doesn't work, return
|
|
if ok := sys.GetLogicalProcessorInformation(raw_data(infos[:]), &returned_length); !ok {
|
|
return 0, 0, false
|
|
}
|
|
|
|
for info in infos[:count] {
|
|
#partial switch info.Relationship {
|
|
case .RelationProcessorCore: physical += 1
|
|
case .RelationNumaNode: logical += int(intrinsics.count_ones(info.ProcessorMask))
|
|
}
|
|
}
|
|
|
|
return physical, logical, true
|
|
} |