Changeset 43908 in vbox for trunk/src/VBox/Main/src-client
- Timestamp:
- Nov 19, 2012 5:36:43 AM (12 years ago)
- svn:sync-xref-src-repo-rev:
- 82169
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Main/src-client/GuestImpl.cpp
r42919 r43908 33 33 #include <VBox/VMMDev.h> 34 34 #include <iprt/cpp/utils.h> 35 #include <iprt/ctype.h> 36 #include <iprt/stream.h> 35 37 #include <iprt/timer.h> 36 38 #include <VBox/vmm/pgm.h> … … 95 97 96 98 /* Clear statistics. */ 99 mNetStatRx = mNetStatTx = 0; 100 mNetStatLastTs = RTTimeNanoTS(); 97 101 for (unsigned i = 0 ; i < GUESTSTATTYPE_MAX; i++) 98 102 mCurrentGuestStat[i] = 0; 99 m GuestValidStats = pm::GUESTSTATMASK_NONE;103 mVmValidStats = pm::VMSTATMASK_NONE; 100 104 101 105 mMagic = GUEST_MAGIC; … … 180 184 } 181 185 186 /* static */ 187 int Guest::staticEnumStatsCallback(const char *pszName, STAMTYPE enmType, void *pvSample, STAMUNIT enmUnit, 188 STAMVISIBILITY enmVisiblity, const char *pszDesc, void *pvUser) 189 { 190 PSTAMCOUNTER pCnt = (PSTAMCOUNTER)pvSample; 191 char *pszEnd = strrchr((char*)pszName, '/'); 192 if (pszEnd) 193 { 194 bool fRx; 195 uint8_t uInstance = 0; 196 197 switch (pszEnd[1]) 198 { 199 case 'R': 200 fRx = true; 201 break; 202 case 'T': 203 fRx = false; 204 break; 205 default: 206 LogRel(("Failed to parse the name of network stat counter (unknown counter): %s\n", pszName)); 207 return VINF_SUCCESS; 208 } 209 do 210 --pszEnd; 211 while (pszEnd > pszName && RT_C_IS_DIGIT(*pszEnd)); 212 if (RT_SUCCESS(RTStrToUInt8Ex(pszEnd + 1, NULL, 10, &uInstance))) 213 { 214 Guest *pGuest = (Guest *)pvUser; 215 LogFlowFunc(("%s i=%u d=%s %llu %s\n", pszName, uInstance, fRx ? "RX" : "TX", 216 pCnt->c, STAMR3GetUnit(enmUnit))); 217 if (fRx) 218 pGuest->mNetStatRx += pCnt->c; 219 else 220 pGuest->mNetStatTx += pCnt->c; 221 } 222 else 223 LogRel(("Failed to extract the device instance from the name of network stat counter: %s\n", pszEnd)); 224 } 225 else 226 LogRel(("Failed to parse the name of network stat counter (no slash): %s\n", pszName)); 227 228 return VINF_SUCCESS; 229 } 230 182 231 void Guest::updateStats(uint64_t iTick) 183 232 { … … 187 236 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 188 237 238 ULONG uNetStatRx = 0; 239 ULONG uNetStatTx = 0; 189 240 ULONG aGuestStats[GUESTSTATTYPE_MAX]; 190 241 RT_ZERO(aGuestStats); 191 ULONG validStats = m GuestValidStats;242 ULONG validStats = mVmValidStats; 192 243 /* Check if we have anything to report */ 193 244 if (validStats) 194 245 { 195 m GuestValidStats = pm::GUESTSTATMASK_NONE;246 mVmValidStats = pm::VMSTATMASK_NONE; 196 247 memcpy(aGuestStats, mCurrentGuestStat, sizeof(aGuestStats)); 197 248 } … … 226 277 if (rc == VINF_SUCCESS) 227 278 { 228 validStats |= pm:: GUESTSTATMASK_MEMSHARED;279 validStats |= pm::VMSTATMASK_GUEST_MEMSHARED; 229 280 } 230 281 } … … 236 287 if (rc == VINF_SUCCESS) 237 288 { 238 validStats |= pm::GUESTSTATMASK_ALLOCVMM|pm::GUESTSTATMASK_FREEVMM| 239 pm::GUESTSTATMASK_BALOONVMM|pm::GUESTSTATMASK_SHAREDVMM; 289 validStats |= 290 pm::VMSTATMASK_VMM_ALLOC | pm::VMSTATMASK_VMM_FREE | 291 pm::VMSTATMASK_VMM_BALOON | pm::VMSTATMASK_VMM_SHARED; 240 292 } 241 293 } 242 294 243 } 244 245 mParent->reportGuestStatistics(validStats, 246 aGuestStats[GUESTSTATTYPE_CPUUSER], 247 aGuestStats[GUESTSTATTYPE_CPUKERNEL], 248 aGuestStats[GUESTSTATTYPE_CPUIDLE], 249 /* Convert the units for RAM usage stats: page (4K) -> 1KB units */ 250 mCurrentGuestStat[GUESTSTATTYPE_MEMTOTAL] * (_4K/_1K), 251 mCurrentGuestStat[GUESTSTATTYPE_MEMFREE] * (_4K/_1K), 252 mCurrentGuestStat[GUESTSTATTYPE_MEMBALLOON] * (_4K/_1K), 253 (ULONG)(uSharedMem / _1K), /* bytes -> KB */ 254 mCurrentGuestStat[GUESTSTATTYPE_MEMCACHE] * (_4K/_1K), 255 mCurrentGuestStat[GUESTSTATTYPE_PAGETOTAL] * (_4K/_1K), 256 (ULONG)(uAllocTotal / _1K), /* bytes -> KB */ 257 (ULONG)(uFreeTotal / _1K), 258 (ULONG)(uBalloonedTotal / _1K), 259 (ULONG)(uSharedTotal / _1K)); 295 uint64_t uRxPrev = mNetStatRx; 296 uint64_t uTxPrev = mNetStatTx; 297 mNetStatRx = mNetStatTx = 0; 298 rc = STAMR3Enum(pVM, "*/ReceiveBytes|*/TransmitBytes", staticEnumStatsCallback, this); 299 uint64_t uTsNow = RTTimeNanoTS(); 300 uint64_t uTimePassed = uTsNow - mNetStatLastTs; 301 mNetStatLastTs = uTsNow; 302 uNetStatRx = (ULONG)((mNetStatRx - uRxPrev) * 1000000 / (uTimePassed / 1000)); /* in bytes per second */ 303 uNetStatTx = (ULONG)((mNetStatTx - uTxPrev) * 1000000 / (uTimePassed / 1000)); /* in bytes per second */ 304 LogFlowThisFunc(("Net Rx=%llu Tx=%llu Ts=%llu Delta=%llu\n", mNetStatRx, mNetStatTx, uTsNow, uTimePassed)); 305 AssertRC(rc); 306 validStats |= pm::VMSTATMASK_NET_RX | pm::VMSTATMASK_NET_TX; 307 } 308 309 mParent->reportVmStatistics(validStats, 310 aGuestStats[GUESTSTATTYPE_CPUUSER], 311 aGuestStats[GUESTSTATTYPE_CPUKERNEL], 312 aGuestStats[GUESTSTATTYPE_CPUIDLE], 313 /* Convert the units for RAM usage stats: page (4K) -> 1KB units */ 314 mCurrentGuestStat[GUESTSTATTYPE_MEMTOTAL] * (_4K/_1K), 315 mCurrentGuestStat[GUESTSTATTYPE_MEMFREE] * (_4K/_1K), 316 mCurrentGuestStat[GUESTSTATTYPE_MEMBALLOON] * (_4K/_1K), 317 (ULONG)(uSharedMem / _1K), /* bytes -> KB */ 318 mCurrentGuestStat[GUESTSTATTYPE_MEMCACHE] * (_4K/_1K), 319 mCurrentGuestStat[GUESTSTATTYPE_PAGETOTAL] * (_4K/_1K), 320 (ULONG)(uAllocTotal / _1K), /* bytes -> KB */ 321 (ULONG)(uFreeTotal / _1K), 322 (ULONG)(uBalloonedTotal / _1K), 323 (ULONG)(uSharedTotal / _1K), 324 uNetStatRx, 325 uNetStatTx); 260 326 } 261 327 … … 620 686 static ULONG indexToPerfMask[] = 621 687 { 622 pm:: GUESTSTATMASK_CPUUSER,623 pm:: GUESTSTATMASK_CPUKERNEL,624 pm:: GUESTSTATMASK_CPUIDLE,625 pm:: GUESTSTATMASK_MEMTOTAL,626 pm:: GUESTSTATMASK_MEMFREE,627 pm:: GUESTSTATMASK_MEMBALLOON,628 pm:: GUESTSTATMASK_MEMCACHE,629 pm:: GUESTSTATMASK_PAGETOTAL,630 pm:: GUESTSTATMASK_NONE688 pm::VMSTATMASK_GUEST_CPUUSER, 689 pm::VMSTATMASK_GUEST_CPUKERNEL, 690 pm::VMSTATMASK_GUEST_CPUIDLE, 691 pm::VMSTATMASK_GUEST_MEMTOTAL, 692 pm::VMSTATMASK_GUEST_MEMFREE, 693 pm::VMSTATMASK_GUEST_MEMBALLOON, 694 pm::VMSTATMASK_GUEST_MEMCACHE, 695 pm::VMSTATMASK_GUEST_PAGETOTAL, 696 pm::VMSTATMASK_NONE 631 697 }; 632 698 AutoCaller autoCaller(this); … … 639 705 640 706 mCurrentGuestStat[enmType] = aVal; 641 m GuestValidStats |= indexToPerfMask[enmType];707 mVmValidStats |= indexToPerfMask[enmType]; 642 708 return S_OK; 643 709 }
Note:
See TracChangeset
for help on using the changeset viewer.