summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorDmitry Atamanov <data-man@users.noreply.github.com>2017-10-25 17:19:40 +0300
committerAndreas Rumpf <rumpf_a@web.de>2017-10-25 16:19:40 +0200
commitaa1b575133961cf55642d8d0418e1683c211bb41 (patch)
tree0bfac548fa12cc9559cea3726730f329496e0b9e
parent49c6dbf4ab3e60a0e850ac876e54c0c6bc07de89 (diff)
downloadNim-aa1b575133961cf55642d8d0418e1683c211bb41.tar.gz
[Windows] Use GetSystemInfo for obtaining processor count (#6082)
-rw-r--r--lib/pure/concurrency/cpuinfo.nim27
1 files changed, 25 insertions, 2 deletions
diff --git a/lib/pure/concurrency/cpuinfo.nim b/lib/pure/concurrency/cpuinfo.nim
index 603fee080..66ebd155c 100644
--- a/lib/pure/concurrency/cpuinfo.nim
+++ b/lib/pure/concurrency/cpuinfo.nim
@@ -45,8 +45,31 @@ proc countProcessors*(): int {.rtl, extern: "ncpi$1".} =
   ## returns the numer of the processors/cores the machine has.
   ## Returns 0 if it cannot be detected.
   when defined(windows):
-    var x = getEnv("NUMBER_OF_PROCESSORS")
-    if x.len > 0: result = parseInt(x.string)
+    type
+      SYSTEM_INFO_UNION1_STRUCT1 {.final, pure.} = object
+        wProcessorArchitecture: int16
+        wReserved: int16
+      SYSTEM_INFO_UNION1 {.final, union, pure.} = object
+        dwOemId: int32
+        s1: SYSTEM_INFO_UNION1_STRUCT1
+      SYSTEM_INFO {.final, pure.} = object
+        u1: SYSTEM_INFO_UNION1
+        dwPageSize: int32
+        lpMinimumApplicationAddress: pointer
+        lpMaximumApplicationAddress: pointer
+        dwActiveProcessorMask: int32
+        dwNumberOfProcessors: int32
+        dwProcessorType: int32
+        dwAllocationGranularity: int32
+        wProcessorLevel: int16
+        wProcessorRevision: int16
+
+    proc GetSystemInfo(lpSystemInfo: var SYSTEM_INFO) {.stdcall, dynlib: "kernel32", importc: "GetSystemInfo".}
+
+    var
+      si: SYSTEM_INFO
+    GetSystemInfo(si)
+    result = si.dwNumberOfProcessors
   elif defined(macosx) or defined(bsd):
     var
       mib: array[0..3, cint]