Changeset 47096 in vbox for trunk/src/VBox/Runtime/r3/darwin
- Timestamp:
- Jul 11, 2013 2:31:35 PM (12 years ago)
- svn:sync-xref-src-repo-rev:
- 87175
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/r3/darwin/mp-darwin.cpp
r46668 r47096 47 47 48 48 /** 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 */ 53 static 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 */ 69 static 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 */ 85 static 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 */ 101 static RTCPUID rtMpDarwinOnlinePhysicalCpus(void) 102 { 103 int cCpus = -1; 104 size_t cb = sizeof(cCpus); 105 int rc = sysctlbyname("hw.physicalcpu", &cCpus, &cb, NULL, 0); 61 106 if (rc != -1 && cCpus >= 1) 62 107 return cCpus; … … 70 115 RTDECL(int) RTMpCpuIdToSetIndex(RTCPUID idCpu) 71 116 { 72 return idCpu < RTCPUSET_MAX_CPUS && idCpu < rtMpDarwinMax Cpus() ? idCpu : -1;117 return idCpu < RTCPUSET_MAX_CPUS && idCpu < rtMpDarwinMaxLogicalCpus() ? idCpu : -1; 73 118 } 74 119 … … 76 121 RTDECL(RTCPUID) RTMpCpuIdFromSetIndex(int iCpu) 77 122 { 78 return (unsigned)iCpu < rtMpDarwinMax Cpus() ? iCpu : NIL_RTCPUID;123 return (unsigned)iCpu < rtMpDarwinMaxLogicalCpus() ? iCpu : NIL_RTCPUID; 79 124 } 80 125 … … 82 127 RTDECL(RTCPUID) RTMpGetMaxCpuId(void) 83 128 { 84 return rtMpDarwinMax Cpus() - 1;129 return rtMpDarwinMaxLogicalCpus() - 1; 85 130 } 86 131 … … 108 153 { 109 154 return idCpu != NIL_RTCPUID 110 && idCpu < rtMpDarwinMax Cpus();155 && idCpu < rtMpDarwinMaxLogicalCpus(); 111 156 } 112 157 … … 115 160 { 116 161 #if 0 117 RTCPUID cCpus = rtMpDarwinMax Cpus();162 RTCPUID cCpus = rtMpDarwinMaxLogicalCpus(); 118 163 return RTCpuSetFromU64(RT_BIT_64(cCpus) - 1); 119 164 120 165 #else 121 166 RTCpuSetEmpty(pSet); 122 RTCPUID cMax = rtMpDarwinMax Cpus();167 RTCPUID cMax = rtMpDarwinMaxLogicalCpus(); 123 168 for (RTCPUID idCpu = 0; idCpu < cMax; idCpu++) 124 169 if (RTMpIsCpuPossible(idCpu)) … … 131 176 RTDECL(RTCPUID) RTMpGetCount(void) 132 177 { 133 return rtMpDarwinMaxCpus(); 178 return rtMpDarwinMaxLogicalCpus(); 179 } 180 181 182 RTDECL(RTCPUID) RTMpGetCoreCount(void) 183 { 184 return rtMpDarwinMaxPhysicalCpus(); 134 185 } 135 186 … … 141 192 #else 142 193 RTCpuSetEmpty(pSet); 143 RTCPUID cMax = rtMpDarwinMax Cpus();194 RTCPUID cMax = rtMpDarwinMaxLogicalCpus(); 144 195 for (RTCPUID idCpu = 0; idCpu < cMax; idCpu++) 145 196 if (RTMpIsCpuOnline(idCpu))
Note:
See TracChangeset
for help on using the changeset viewer.