- Timestamp:
- Oct 21, 2024 8:43:04 PM (6 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kmk/w32/winchildren.c
r3359 r3617 345 345 /** Array detailing how many active processors there are in each group. */ 346 346 static unsigned const *g_pacProcessorsInGroup = &g_cProcessorGroups; 347 /** Info from the GetLogicalProcessorInformationEx call - can be NULL. */ 348 static GROUP_RELATIONSHIP const *g_pGroupInfo = NULL; 349 347 350 /** Kernel32!GetActiveProcessorGroupCount */ 348 351 static WORD (WINAPI *g_pfnGetActiveProcessorGroupCount)(VOID); 349 352 /** Kernel32!GetActiveProcessorCount */ 350 353 static DWORD (WINAPI *g_pfnGetActiveProcessorCount)(WORD); 354 /** Kernel32!GetLogicalProcessorInformationEx */ 355 static DWORD (WINAPI *g_pfnGetLogicalProcessorInformationEx)(LOGICAL_PROCESSOR_RELATIONSHIP, 356 PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX, PDWORD); 351 357 /** Kernel32!SetThreadGroupAffinity */ 352 358 static BOOL (WINAPI *g_pfnSetThreadGroupAffinity)(HANDLE, CONST GROUP_AFFINITY *, GROUP_AFFINITY *); … … 460 466 { 461 467 hmod = GetModuleHandleA("KERNEL32.DLL"); 462 *(FARPROC *)&g_pfnGetActiveProcessorGroupCount = GetProcAddress(hmod, "GetActiveProcessorGroupCount"); 463 *(FARPROC *)&g_pfnGetActiveProcessorCount = GetProcAddress(hmod, "GetActiveProcessorCount"); 464 *(FARPROC *)&g_pfnSetThreadGroupAffinity = GetProcAddress(hmod, "SetThreadGroupAffinity"); 468 *(FARPROC *)&g_pfnGetActiveProcessorGroupCount = GetProcAddress(hmod, "GetActiveProcessorGroupCount"); 469 *(FARPROC *)&g_pfnGetActiveProcessorCount = GetProcAddress(hmod, "GetActiveProcessorCount"); 470 *(FARPROC *)&g_pfnSetThreadGroupAffinity = GetProcAddress(hmod, "SetThreadGroupAffinity"); 471 *(FARPROC *)&g_pfnGetLogicalProcessorInformationEx = GetProcAddress(hmod, "GetLogicalProcessorInformationEx"); 472 /*(FARPROC *)&g_pfnGetSystemCpuSetInformation = GetProcAddress(hmod, "GetSystemCpuSetInformation"); / * W10 */ 473 /*(FARPROC *)&g_pfnSetThreadSelectedCpuSetMasks = GetProcAddress(hmod, "SetThreadSelectedCpuSetMasks"); / * W11 */ 465 474 if ( g_pfnSetThreadGroupAffinity 466 475 && g_pfnGetActiveProcessorCount 467 && g_pfnGetActiveProcessorGroupCount) 476 && g_pfnGetActiveProcessorGroupCount 477 && g_pfnGetLogicalProcessorInformationEx) 468 478 { 469 479 unsigned int *pacProcessorsInGroup; … … 478 488 pacProcessorsInGroup[iGroup] = g_pfnGetActiveProcessorCount(iGroup); 479 489 490 /* Get active process group affinity masks so we can set them correctly. */ 491 { 492 DWORD cbNeeded = cbNeeded = offsetof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX, Group) 493 + offsetof(GROUP_RELATIONSHIP, GroupInfo) 494 + sizeof(PROCESSOR_GROUP_INFO) * (g_cProcessorGroups + 4); 495 PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX pInfo = (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX)xcalloc(cbNeeded); 496 BOOL fRet = g_pfnGetLogicalProcessorInformationEx(RelationGroup, pInfo, &cbNeeded); 497 if (!fRet && GetLastError() == ERROR_BUFFER_OVERFLOW) 498 { 499 free(pInfo); 500 pInfo = (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX)xcalloc(cbNeeded); 501 fRet = g_pfnGetLogicalProcessorInformationEx(RelationGroup, pInfo, &cbNeeded); 502 } 503 if ( fRet 504 && pInfo->Group.ActiveGroupCount > 0 505 && pInfo->Group.ActiveGroupCount <= pInfo->Group.MaximumGroupCount) 506 { 507 g_pGroupInfo = &pInfo->Group; /* leaked */ 508 pInfo = NULL; 509 } 510 else 511 free(pInfo); 512 } 513 480 514 MkWinChildInitCpuGroupAllocator(&g_ProcessorGroupAllocator); 481 515 } 482 516 else 483 517 { 484 g_pfnSetThreadGroupAffinity = NULL; 485 g_pfnGetActiveProcessorCount = NULL; 486 g_pfnGetActiveProcessorGroupCount = NULL; 518 g_pfnSetThreadGroupAffinity = NULL; 519 g_pfnGetActiveProcessorCount = NULL; 520 g_pfnGetActiveProcessorGroupCount = NULL; 521 g_pfnGetLogicalProcessorInformationEx = NULL; 487 522 } 488 523 } … … 1343 1378 if (g_cProcessorGroups > 1) 1344 1379 { 1345 GROUP_AFFINITY Affinity = { 0 /* == all active apparently */, pWorker->iProcessorGroup, { 0, 0, 0 } }; 1380 GROUP_AFFINITY Affinity = { 0, pWorker->iProcessorGroup, { 0, 0, 0 } }; 1381 if (g_pGroupInfo && pWorker->iProcessorGroup < g_pGroupInfo->ActiveGroupCount) 1382 Affinity.Mask = g_pGroupInfo->GroupInfo[pWorker->iProcessorGroup].ActiveProcessorMask; 1346 1383 fRet = g_pfnSetThreadGroupAffinity(ProcInfo.hThread, &Affinity, NULL); 1347 1384 assert(fRet); … … 2561 2598 if (g_cProcessorGroups > 1) 2562 2599 { 2563 GROUP_AFFINITY Affinity = { 0 /* == all active apparently */, pWorker->iProcessorGroup, { 0, 0, 0 } }; 2564 BOOL fRet = g_pfnSetThreadGroupAffinity(GetCurrentThread(), &Affinity, NULL); 2600 BOOL fRet; 2601 GROUP_AFFINITY Affinity = { 0, pWorker->iProcessorGroup, { 0, 0, 0 } }; 2602 if (g_pGroupInfo && pWorker->iProcessorGroup < g_pGroupInfo->ActiveGroupCount) 2603 Affinity.Mask = g_pGroupInfo->GroupInfo[pWorker->iProcessorGroup].ActiveProcessorMask; 2604 2605 fRet = g_pfnSetThreadGroupAffinity(GetCurrentThread(), &Affinity, NULL); 2565 2606 assert(fRet); (void)fRet; 2566 2607 # ifndef NDEBUG
Note:
See TracChangeset
for help on using the changeset viewer.