Piotr Caban : ntdll: Added processor cores information to SystemLogicalProcessorInformation ( Mac).

Alexandre Julliard julliard at winehq.org
Wed Sep 5 15:36:45 CDT 2012


Module: wine
Branch: master
Commit: 6c2b7332d376cfb050199a12f5f24f2b3656588d
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=6c2b7332d376cfb050199a12f5f24f2b3656588d

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Wed Sep  5 12:00:55 2012 +0200

ntdll: Added processor cores information to SystemLogicalProcessorInformation (Mac).

---

 dlls/ntdll/nt.c |   45 +++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 45 insertions(+), 0 deletions(-)

diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c
index 863844a..0b01010 100644
--- a/dlls/ntdll/nt.c
+++ b/dlls/ntdll/nt.c
@@ -1606,6 +1606,51 @@ static NTSTATUS create_logical_proc_info(SYSTEM_LOGICAL_PROCESSOR_INFORMATION **
     *max_len = len * sizeof(**data);
     return STATUS_SUCCESS;
 }
+#elif defined(__APPLE__)
+static NTSTATUS create_logical_proc_info(SYSTEM_LOGICAL_PROCESSOR_INFORMATION **data, DWORD *max_len)
+{
+    DWORD len = 0, i, j;
+    DWORD cores_no, lcpu_no, lcpu_per_core, cores_per_package;
+    size_t size;
+    ULONG_PTR mask;
+
+    lcpu_no = NtCurrentTeb()->Peb->NumberOfProcessors;
+
+    size = sizeof(cores_no);
+    if(sysctlbyname("machdep.cpu.core_count", &cores_no, &size, NULL, 0))
+        cores_no = lcpu_no;
+
+    lcpu_per_core = lcpu_no/cores_no;
+    for(i=0; i<cores_no; i++)
+    {
+        mask = 0;
+        for(j=lcpu_per_core*i; j<lcpu_per_core*(i+1); j++)
+            mask |= (ULONG_PTR)1<<j;
+
+        (*data)[len].Relationship = RelationProcessorCore;
+        (*data)[len].ProcessorMask = mask;
+        (*data)[len].u.ProcessorCore.Flags = 0; /* TODO */
+        len++;
+    }
+
+    size = sizeof(cores_per_package);
+    if(sysctlbyname("machdep.cpu.cores_per_package", &cores_per_package, &size, NULL, 0))
+        cores_per_package = lcpu_no;
+
+    for(i=0; i<(lcpu_no+cores_per_package-1)/cores_per_package; i++)
+    {
+        mask = 0;
+        for(j=cores_per_package*i; j<cores_per_package*(i+1) && j<lcpu_no; j++)
+            mask |= (ULONG_PTR)1<<j;
+
+        (*data)[len].Relationship = RelationProcessorPackage;
+        (*data)[len].ProcessorMask = mask;
+        len++;
+    }
+
+    *max_len = len * sizeof(**data);
+    return STATUS_SUCCESS;
+}
 #else
 static NTSTATUS create_logical_proc_info(SYSTEM_LOGICAL_PROCESSOR_INFORMATION **data, DWORD *max_len)
 {




More information about the wine-cvs mailing list