Hans Leidekker : wbemprox: Implement Win32_Processor.NumberOfCores.

Alexandre Julliard julliard at winehq.org
Fri Jun 14 11:03:51 CDT 2013


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

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Fri Jun 14 10:03:25 2013 +0200

wbemprox: Implement Win32_Processor.NumberOfCores.

---

 dlls/wbemprox/builtin.c |   26 ++++++++++++++++++++------
 1 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/dlls/wbemprox/builtin.c b/dlls/wbemprox/builtin.c
index 1e9c297..3504602 100644
--- a/dlls/wbemprox/builtin.c
+++ b/dlls/wbemprox/builtin.c
@@ -168,6 +168,8 @@ static const WCHAR prop_modelW[] =
     {'M','o','d','e','l',0};
 static const WCHAR prop_netconnectionstatusW[] =
     {'N','e','t','C','o','n','n','e','c','t','i','o','n','S','t','a','t','u','s',0};
+static const WCHAR prop_numcoresW[] =
+    {'N','u','m','b','e','r','O','f','C','o','r','e','s',0};
 static const WCHAR prop_numlogicalprocessorsW[] =
     {'N','u','m','b','e','r','O','f','L','o','g','i','c','a','l','P','r','o','c','e','s','s','o','r','s',0};
 static const WCHAR prop_numprocessorsW[] =
@@ -363,6 +365,7 @@ static const struct column col_processor[] =
     { prop_manufacturerW,         CIM_STRING|COL_FLAG_DYNAMIC },
     { prop_maxclockspeedW,        CIM_UINT32, VT_I4 },
     { prop_nameW,                 CIM_STRING|COL_FLAG_DYNAMIC },
+    { prop_numcoresW,             CIM_UINT32, VT_I4 },
     { prop_numlogicalprocessorsW, CIM_UINT32, VT_I4 },
     { prop_processoridW,          CIM_STRING|COL_FLAG_DYNAMIC },
     { prop_uniqueidW,             CIM_STRING }
@@ -605,6 +608,7 @@ struct record_processor
     const WCHAR *manufacturer;
     UINT32       maxclockspeed;
     const WCHAR *name;
+    UINT32       num_cores;
     UINT32       num_logical_processors;
     const WCHAR *processor_id;
     const WCHAR *unique_id;
@@ -799,13 +803,14 @@ static UINT get_processor_count(void)
     return info.NumberOfProcessors;
 }
 
-static UINT get_logical_processor_count(void)
+static UINT get_logical_processor_count( UINT *num_cores )
 {
     SYSTEM_LOGICAL_PROCESSOR_INFORMATION *info;
     UINT i, j, count = 0;
     NTSTATUS status;
     ULONG len;
 
+    if (num_cores) *num_cores = get_processor_count();
     status = NtQuerySystemInformation( SystemLogicalProcessorInformation, NULL, 0, &len );
     if (status != STATUS_INFO_LENGTH_MISMATCH) return get_processor_count();
 
@@ -816,10 +821,17 @@ static UINT get_logical_processor_count(void)
         heap_free( info );
         return get_processor_count();
     }
+    if (num_cores) *num_cores = 0;
     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++;
+        if (info[i].Relationship == RelationProcessorCore)
+        {
+            for (j = 0; j < sizeof(ULONG_PTR); j++) if (info[i].ProcessorMask & (1 << j)) count++;
+        }
+        else if (info[i].Relationship == RelationProcessorPackage && num_cores)
+        {
+            for (j = 0; j < sizeof(ULONG_PTR); j++) if (info[i].ProcessorMask & (1 << j)) (*num_cores)++;
+        }
     }
     heap_free( info );
     return count;
@@ -859,7 +871,7 @@ static enum fill_status fill_compsys( struct table *table, const struct expr *co
     rec->manufacturer           = compsys_manufacturerW;
     rec->model                  = compsys_modelW;
     rec->name                   = get_computername();
-    rec->num_logical_processors = get_logical_processor_count();
+    rec->num_logical_processors = get_logical_processor_count( NULL );
     rec->num_processors         = get_processor_count();
     rec->total_physical_memory  = get_total_physical_memory();
     if (!match_row( table, row, cond, &status )) free_row_values( table, row );
@@ -1672,7 +1684,7 @@ static enum fill_status fill_processor( struct table *table, const struct expr *
     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, maxclockspeed, num_logical_processors, count = get_processor_count();
+    UINT i, offset = 0, maxclockspeed, num_cores, num_logical_processors, count = get_processor_count();
     enum fill_status status = FILL_STATUS_UNFILTERED;
 
     if (!resize_table( table, count, sizeof(*rec) )) return FILL_STATUS_FAILED;
@@ -1682,7 +1694,8 @@ static enum fill_status fill_processor( struct table *table, const struct expr *
     get_processor_name( name );
 
     maxclockspeed = get_processor_maxclockspeed();
-    num_logical_processors = get_logical_processor_count() / count;
+    num_logical_processors = get_logical_processor_count( &num_cores ) / count;
+    num_cores /= count;
 
     for (i = 0; i < count; i++)
     {
@@ -1695,6 +1708,7 @@ static enum fill_status fill_processor( struct table *table, const struct expr *
         rec->manufacturer           = heap_strdupW( manufacturer );
         rec->maxclockspeed          = maxclockspeed;
         rec->name                   = heap_strdupW( name );
+        rec->num_cores              = num_cores;
         rec->num_logical_processors = num_logical_processors;
         rec->processor_id           = heap_strdupW( processor_id );
         rec->unique_id              = NULL;




More information about the wine-cvs mailing list