VirtualBox

Changeset 46616 in vbox


Ignore:
Timestamp:
Jun 18, 2013 10:48:34 AM (11 years ago)
Author:
vboxsync
Message:

Runtime/r3/mp-win, Runtime/Makefile: Support for getting physical core count for Windows.

Location:
trunk/src/VBox
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/Makefile.kmk

    r46593 r46616  
    565565        generic/RTDirSetTimes-generic.cpp \
    566566        generic/RTFileExists-generic.cpp \
    567         generic/RTMpGetCoreCount-generic.cpp \
    568567        generic/RTMpGetCurFrequency-generic.cpp \
    569568        generic/RTMpGetMaxFrequency-generic.cpp \
  • trunk/src/VBox/Runtime/r3/win/mp-win.cpp

    r44528 r46616  
    9191}
    9292
     93RTDECL(RTCPUID) RTMpGetCoreCount(void)
     94{
     95    PSYSTEM_LOGICAL_PROCESSOR_INFORMATION pSysInfo = NULL;
     96    PSYSTEM_LOGICAL_PROCESSOR_INFORMATION pSysInfoTmp = NULL;
     97    DWORD sysProcInfoLen = 0;
     98    DWORD offset = 0;
     99    DWORD coreCount = 0;
     100    BOOL rc;
     101    BOOL (WINAPI *pfnGetLogicalProcInfo)(PSYSTEM_LOGICAL_PROCESSOR_INFORMATION, PDWORD);
     102
     103    pfnGetLogicalProcInfo = (BOOL (WINAPI *)(PSYSTEM_LOGICAL_PROCESSOR_INFORMATION, PDWORD))
     104                             GetProcAddress(GetModuleHandle("KERNEL32.DLL"), "GetLogicalProcessorInformation");
     105    /* 0 represent error condition. Can't return VERR* error codes as caller expects a unsigned value of core count.*/
     106    if (!pfnGetLogicalProcInfo)
     107        return 0;
     108
     109    rc = pfnGetLogicalProcInfo(pSysInfo, &sysProcInfoLen);
     110    if (rc == FALSE)
     111    {
     112        if (GetLastError() ==  ERROR_INSUFFICIENT_BUFFER)
     113        {
     114            RTMemFree(pSysInfo);
     115            pSysInfo = (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION)RTMemAlloc(sysProcInfoLen);
     116            if (!pSysInfo)
     117                 return 0;
     118        }
     119        else
     120            return 0;
     121    }
     122
     123    rc = pfnGetLogicalProcInfo(pSysInfo, &sysProcInfoLen);
     124    if (rc == FALSE)
     125    {
     126        RTMemFree(pSysInfo);
     127        return 0;
     128    }
     129    pSysInfoTmp = pSysInfo;
     130    while (offset + sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION) <= sysProcInfoLen)
     131    {
     132        switch (pSysInfoTmp->Relationship)
     133        {
     134            case RelationProcessorCore:
     135                coreCount++;
     136            break;
     137            case RelationCache:
     138            case RelationNumaNode:
     139            case RelationProcessorPackage:
     140            default:
     141            ;
     142        }
     143        offset += sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION);
     144        pSysInfoTmp++;
     145    }
     146    RTMemFree(pSysInfo);
     147    return coreCount;
     148}
    93149
    94150RTDECL(PRTCPUSET) RTMpGetOnlineSet(PRTCPUSET pSet)
  • trunk/src/VBox/VMM/VMMR3/CPUM.cpp

    r46326 r46616  
    42804280                (unsigned)RTMpGetPresentCount(), (unsigned)RTMpGetCount(), (unsigned)RTMpGetOnlineCount(),
    42814281                RTCpuSetToU64(RTMpGetOnlineSet(&OnlineSet)) ));
     4282    LogRel(("Physical core count = %u\n", (unsigned)RTMpGetCoreCount() ));
    42824283    LogRel(("************************* CPUID dump ************************\n"));
    42834284    DBGFR3Info(pVM->pUVM, "cpuid", "verbose", DBGFR3InfoLogRelHlp());
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette