aboutsummaryrefslogtreecommitdiff
path: root/core/sys/info/cpu_windows.odin
blob: 72d79f9a7fbf90138eabb493da57087e41ac6416 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package sysinfo

import sys "core:sys/windows"
import "base:intrinsics"
import "base:runtime"

@(init, private)
init_cpu_core_count :: proc "contextless" () {
	context = runtime.default_context()

	infos: []sys.SYSTEM_LOGICAL_PROCESSOR_INFORMATION
	defer delete(infos)

	returned_length: sys.DWORD
	// Query for the required buffer size.
	if ok := sys.GetLogicalProcessorInformation(raw_data(infos), &returned_length); !ok {
		infos = make([]sys.SYSTEM_LOGICAL_PROCESSOR_INFORMATION, 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
	}

	for info in infos {
		#partial switch info.Relationship {
		case .RelationProcessorCore: cpu.physical_cores += 1
		case .RelationNumaNode:      cpu.logical_cores  += int(intrinsics.count_ones(info.ProcessorMask))
		}
	}
}