|
@@ -3,6 +3,7 @@ package os
|
|
|
|
|
|
import win32 "core:sys/windows"
|
|
import win32 "core:sys/windows"
|
|
import "core:runtime"
|
|
import "core:runtime"
|
|
|
|
+import "core:intrinsics"
|
|
|
|
|
|
Handle :: distinct uintptr
|
|
Handle :: distinct uintptr
|
|
File_Time :: distinct u64
|
|
File_Time :: distinct u64
|
|
@@ -126,7 +127,28 @@ get_page_size :: proc() -> int {
|
|
return page_size
|
|
return page_size
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+@(private)
|
|
|
|
+_processor_core_count :: proc() -> int {
|
|
|
|
+ length : win32.DWORD = 0
|
|
|
|
+ result := win32.GetLogicalProcessorInformation(nil, &length)
|
|
|
|
|
|
|
|
+ thread_count := 0
|
|
|
|
+ if !result && win32.GetLastError() == 122 && length > 0 {
|
|
|
|
+ processors := make([]win32.SYSTEM_LOGICAL_PROCESSOR_INFORMATION, length, context.temp_allocator)
|
|
|
|
+
|
|
|
|
+ result = win32.GetLogicalProcessorInformation(&processors[0], &length)
|
|
|
|
+ if result {
|
|
|
|
+ for processor in processors {
|
|
|
|
+ if processor.Relationship == .RelationProcessorCore {
|
|
|
|
+ thread := intrinsics.count_ones(processor.ProcessorMask)
|
|
|
|
+ thread_count += int(thread)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return thread_count
|
|
|
|
+}
|
|
|
|
|
|
exit :: proc "contextless" (code: int) -> ! {
|
|
exit :: proc "contextless" (code: int) -> ! {
|
|
runtime._cleanup_runtime_contextless()
|
|
runtime._cleanup_runtime_contextless()
|
|
@@ -214,4 +236,4 @@ is_windows_10 :: proc() -> bool {
|
|
is_windows_11 :: proc() -> bool {
|
|
is_windows_11 :: proc() -> bool {
|
|
osvi := get_windows_version_w()
|
|
osvi := get_windows_version_w()
|
|
return (osvi.dwMajorVersion == 10 && osvi.dwMinorVersion == 0 && osvi.dwBuildNumber >= WINDOWS_11_BUILD_CUTOFF)
|
|
return (osvi.dwMajorVersion == 10 && osvi.dwMinorVersion == 0 && osvi.dwBuildNumber >= WINDOWS_11_BUILD_CUTOFF)
|
|
-}
|
|
|
|
|
|
+}
|