[PATCH 2/4] ntdll: Report logical cores per physical core through mask.

Roderick Colenbrander thunderbird2k at gmail.com
Thu Jun 14 00:48:03 CDT 2018


Signed-off-by: Roderick Colenbrander <thunderbird2k at gmail.com>
---
 dlls/ntdll/nt.c | 28 ++++++++++++++++++++++------
 1 file changed, 22 insertions(+), 6 deletions(-)

diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c
index e6458b98f2..0b69f7de44 100644
--- a/dlls/ntdll/nt.c
+++ b/dlls/ntdll/nt.c
@@ -1325,8 +1325,16 @@ static inline BOOL logical_proc_info_add_by_id(SYSTEM_LOGICAL_PROCESSOR_INFORMAT
                 (*pdata)[i].ProcessorMask |= mask;
                 return TRUE;
             }
-        }else
-            i = *len;
+        }
+        else
+        {
+            for(i=0; i<*len; i++)
+            {
+                if ((*pdata)[i].Relationship==rel && (*pdata)[i].ProcessorMask==mask &&
+                        (*pdata)[i].u.Reserved[1]==id)
+                    return TRUE;
+            }
+        }
 
         while(*len == *pmax_len)
         {
@@ -1352,6 +1360,11 @@ static inline BOOL logical_proc_info_add_by_id(SYSTEM_LOGICAL_PROCESSOR_INFORMAT
                 dataex->u.Processor.GroupMask[0].Mask |= mask;
                 return TRUE;
             }
+            else if (rel == RelationProcessorCore && dataex->Relationship == rel &&
+                    dataex->u.Processor.GroupMask[0].Mask == mask && dataex->u.Processor.Reserved[1] == id)
+            {
+                return TRUE;
+            }
             ofs += dataex->Size;
         }
 
@@ -1548,6 +1561,8 @@ static NTSTATUS create_logical_proc_info(SYSTEM_LOGICAL_PROCESSOR_INFORMATION **
 
         for(i=beg; i<=end; i++)
         {
+            ULONG_PTR thread_mask = 0;
+
             if(i > 8*sizeof(ULONG_PTR))
             {
                 FIXME("skipping logical processor %d\n", i);
@@ -1568,15 +1583,16 @@ static NTSTATUS create_logical_proc_info(SYSTEM_LOGICAL_PROCESSOR_INFORMATION **
                 return STATUS_NO_MEMORY;
             }
 
-            sprintf(name, core_info, i, "core_id");
+            /* Mask of logical threads sharing same physical core. */
+            sprintf(name, core_info, i, "thread_siblings");
             f = fopen(name, "r");
             if(f)
             {
-                fscanf(f, "%u", &r);
+                fscanf(f, "%lx", &thread_mask);
                 fclose(f);
             }
-            else r = i;
-            if(!logical_proc_info_add_by_id(data, dataex, &len, max_len, RelationProcessorCore, r, (ULONG_PTR)1 << i))
+            else thread_mask = 1<<i;
+            if(!logical_proc_info_add_by_id(data, dataex, &len, max_len, RelationProcessorCore, r, thread_mask))
             {
                 fclose(fcpu_list);
                 return STATUS_NO_MEMORY;
-- 
2.14.4




More information about the wine-devel mailing list