Hans Leidekker : wbemprox: Correctly report the number of logical processors.

Alexandre Julliard julliard at winehq.org
Thu Sep 6 13:37:23 CDT 2012


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

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Thu Sep  6 14:03:24 2012 +0200

wbemprox: Correctly report the number of logical processors.

---

 dlls/wbemprox/builtin.c |   54 ++++++++++++++++++++++++++++++++++++----------
 1 files changed, 42 insertions(+), 12 deletions(-)

diff --git a/dlls/wbemprox/builtin.c b/dlls/wbemprox/builtin.c
index e3a5e6d..4c82425 100644
--- a/dlls/wbemprox/builtin.c
+++ b/dlls/wbemprox/builtin.c
@@ -23,6 +23,8 @@
 #include "config.h"
 #include <stdarg.h>
 
+#include "ntstatus.h"
+#define WIN32_NO_STATUS
 #include "windef.h"
 #include "winbase.h"
 #include "wbemcli.h"
@@ -259,7 +261,7 @@ static const struct column col_processor[] =
     { prop_manufacturerW,         CIM_STRING|COL_FLAG_DYNAMIC },
     { prop_maxclockspeedW,        CIM_UINT32 },
     { prop_nameW,                 CIM_STRING|COL_FLAG_DYNAMIC },
-    { prop_numlogicalprocessorsW, CIM_UINT32 },
+    { prop_numlogicalprocessorsW, CIM_UINT32, VT_I4 },
     { prop_processoridW,          CIM_STRING|COL_FLAG_DYNAMIC }
 };
 static const struct column col_service[] =
@@ -400,7 +402,7 @@ struct record_processor
     const WCHAR *manufacturer;
     UINT32       maxclockspeed;
     const WCHAR *name;
-    UINT32       numberoflogicalprocessors;
+    UINT32       num_logical_processors;
     const WCHAR *processor_id;
 };
 struct record_service
@@ -475,6 +477,32 @@ static UINT get_processor_count(void)
     return info.NumberOfProcessors;
 }
 
+static UINT get_logical_processor_count(void)
+{
+    SYSTEM_LOGICAL_PROCESSOR_INFORMATION *info;
+    UINT i, j, count = 0;
+    NTSTATUS status;
+    ULONG len;
+
+    status = NtQuerySystemInformation( SystemLogicalProcessorInformation, NULL, 0, &len );
+    if (status != STATUS_INFO_LENGTH_MISMATCH) return get_processor_count();
+
+    if (!(info = heap_alloc( len ))) return get_processor_count();
+    status = NtQuerySystemInformation( SystemLogicalProcessorInformation, info, len, &len );
+    if (status != STATUS_SUCCESS)
+    {
+        heap_free( info );
+        return get_processor_count();
+    }
+    for (i = 0; i < len / sizeof(*info); i++)
+    {
+        if (info[i].Relationship != RelationProcessorCore) continue;
+        for (j = 0; j < sizeof(ULONG_PTR); j++) if (info[i].ProcessorMask & (1 << j)) count++;
+    }
+    heap_free( info );
+    return count;
+}
+
 static UINT64 get_total_physical_memory(void)
 {
     MEMORYSTATUSEX status;
@@ -495,8 +523,8 @@ static void fill_compsys( struct table *table )
     rec->domainrole             = 0; /* standalone workstation */
     rec->manufacturer           = compsys_manufacturerW;
     rec->model                  = compsys_modelW;
-    rec->num_logical_processors = get_processor_count();
-    rec->num_processors         = rec->num_logical_processors;
+    rec->num_logical_processors = get_logical_processor_count();
+    rec->num_processors         = get_processor_count();
     rec->total_physical_memory  = get_total_physical_memory();
 
     TRACE("created 1 row\n");
@@ -758,7 +786,7 @@ static void fill_processor( struct table *table )
     static const WCHAR fmtW[] = {'C','P','U','%','u',0};
     WCHAR device_id[14], processor_id[17], manufacturer[13], name[49] = {0};
     struct record_processor *rec;
-    UINT i, offset = 0, count = get_processor_count(), cpuMhz;
+    UINT i, offset = 0, num_logical_processors, count = get_processor_count(), cpuMhz;
     PROCESSOR_POWER_INFORMATION ppi;
 
     if (!(table->data = heap_alloc( sizeof(*rec) * count ))) return;
@@ -772,17 +800,19 @@ static void fill_processor( struct table *table )
     else
         cpuMhz = 1000000;
 
+    num_logical_processors = get_logical_processor_count() / count;
+
     for (i = 0; i < count; i++)
     {
         rec = (struct record_processor *)(table->data + offset);
-        rec->cpu_status   = 1; /* CPU Enabled */
+        rec->cpu_status             = 1; /* CPU Enabled */
         sprintfW( device_id, fmtW, i );
-        rec->device_id    = heap_strdupW( device_id );
-        rec->manufacturer = heap_strdupW( manufacturer );
-        rec->maxclockspeed = cpuMhz;
-        rec->name         = heap_strdupW( name );
-        rec->numberoflogicalprocessors = count;
-        rec->processor_id = heap_strdupW( processor_id );
+        rec->device_id              = heap_strdupW( device_id );
+        rec->manufacturer           = heap_strdupW( manufacturer );
+        rec->maxclockspeed          = cpuMhz;
+        rec->name                   = heap_strdupW( name );
+        rec->num_logical_processors = num_logical_processors;
+        rec->processor_id           = heap_strdupW( processor_id );
         offset += sizeof(*rec);
     }
 




More information about the wine-cvs mailing list