VirtualBox

Changeset 47096 in vbox for trunk/src/VBox/Runtime/r3/darwin


Ignore:
Timestamp:
Jul 11, 2013 2:31:35 PM (12 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
87175
Message:

Runtime/darwin: implemented RTMpGetCoreCount()

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/r3/darwin/mp-darwin.cpp

    r46668 r47096  
    4747
    4848/**
    49  * Internal worker that determines the max possible CPU count.
    50  *
    51  * @returns Max cpus.
    52  */
    53 static RTCPUID rtMpDarwinMaxCpus(void)
    54 {
    55     int aiMib[2];
    56     aiMib[0] = CTL_HW;
    57     aiMib[1] = HW_NCPU;
    58     int cCpus = -1;
    59     size_t cb = sizeof(cCpus);
    60     int rc = sysctl(aiMib, RT_ELEMENTS(aiMib), &cCpus, &cb, NULL, 0);
     49 * Internal worker that determines the max possible logical CPU count (hyperthreads).
     50 *
     51 * @returns Max cpus.
     52 */
     53static RTCPUID rtMpDarwinMaxLogicalCpus(void)
     54{
     55    int cCpus = -1;
     56    size_t cb = sizeof(cCpus);
     57    int rc = sysctlbyname("hw.logicalcpu_max", &cCpus, &cb, NULL, 0);
     58    if (rc != -1 && cCpus >= 1)
     59        return cCpus;
     60    AssertFailed();
     61    return 1;
     62}
     63
     64/**
     65 * Internal worker that determines the max possible physical core count.
     66 *
     67 * @returns Max cpus.
     68 */
     69static RTCPUID rtMpDarwinMaxPhysicalCpus(void)
     70{
     71    int cCpus = -1;
     72    size_t cb = sizeof(cCpus);
     73    int rc = sysctlbyname("hw.physicalcpu_max", &cCpus, &cb, NULL, 0);
     74    if (rc != -1 && cCpus >= 1)
     75        return cCpus;
     76    AssertFailed();
     77    return 1;
     78}
     79
     80/**
     81 * Internal worker that determines the current number of logical CPUs (hyperthreads).
     82 *
     83 * @returns Max cpus.
     84 */
     85static RTCPUID rtMpDarwinOnlineLogicalCpus(void)
     86{
     87    int cCpus = -1;
     88    size_t cb = sizeof(cCpus);
     89    int rc = sysctlbyname("hw.logicalcpu", &cCpus, &cb, NULL, 0);
     90    if (rc != -1 && cCpus >= 1)
     91        return cCpus;
     92    AssertFailed();
     93    return 1;
     94}
     95
     96/**
     97 * Internal worker that determines the current number of physical CPUs.
     98 *
     99 * @returns Max cpus.
     100 */
     101static RTCPUID rtMpDarwinOnlinePhysicalCpus(void)
     102{
     103    int cCpus = -1;
     104    size_t cb = sizeof(cCpus);
     105    int rc = sysctlbyname("hw.physicalcpu", &cCpus, &cb, NULL, 0);
    61106    if (rc != -1 && cCpus >= 1)
    62107        return cCpus;
     
    70115RTDECL(int) RTMpCpuIdToSetIndex(RTCPUID idCpu)
    71116{
    72     return idCpu < RTCPUSET_MAX_CPUS && idCpu < rtMpDarwinMaxCpus() ? idCpu : -1;
     117    return idCpu < RTCPUSET_MAX_CPUS && idCpu < rtMpDarwinMaxLogicalCpus() ? idCpu : -1;
    73118}
    74119
     
    76121RTDECL(RTCPUID) RTMpCpuIdFromSetIndex(int iCpu)
    77122{
    78     return (unsigned)iCpu < rtMpDarwinMaxCpus() ? iCpu : NIL_RTCPUID;
     123    return (unsigned)iCpu < rtMpDarwinMaxLogicalCpus() ? iCpu : NIL_RTCPUID;
    79124}
    80125
     
    82127RTDECL(RTCPUID) RTMpGetMaxCpuId(void)
    83128{
    84     return rtMpDarwinMaxCpus() - 1;
     129    return rtMpDarwinMaxLogicalCpus() - 1;
    85130}
    86131
     
    108153{
    109154    return idCpu != NIL_RTCPUID
    110         && idCpu < rtMpDarwinMaxCpus();
     155        && idCpu < rtMpDarwinMaxLogicalCpus();
    111156}
    112157
     
    115160{
    116161#if 0
    117     RTCPUID cCpus = rtMpDarwinMaxCpus();
     162    RTCPUID cCpus = rtMpDarwinMaxLogicalCpus();
    118163    return RTCpuSetFromU64(RT_BIT_64(cCpus) - 1);
    119164
    120165#else
    121166    RTCpuSetEmpty(pSet);
    122     RTCPUID cMax = rtMpDarwinMaxCpus();
     167    RTCPUID cMax = rtMpDarwinMaxLogicalCpus();
    123168    for (RTCPUID idCpu = 0; idCpu < cMax; idCpu++)
    124169        if (RTMpIsCpuPossible(idCpu))
     
    131176RTDECL(RTCPUID) RTMpGetCount(void)
    132177{
    133     return rtMpDarwinMaxCpus();
     178    return rtMpDarwinMaxLogicalCpus();
     179}
     180
     181
     182RTDECL(RTCPUID) RTMpGetCoreCount(void)
     183{
     184    return rtMpDarwinMaxPhysicalCpus();
    134185}
    135186
     
    141192#else
    142193    RTCpuSetEmpty(pSet);
    143     RTCPUID cMax = rtMpDarwinMaxCpus();
     194    RTCPUID cMax = rtMpDarwinMaxLogicalCpus();
    144195    for (RTCPUID idCpu = 0; idCpu < cMax; idCpu++)
    145196        if (RTMpIsCpuOnline(idCpu))
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